Entwickler-Ecke

Internet / Netzwerk - Probleme nach dem Wechsel des Ports beim Server


alias5000 - Mo 30.01.06 13:29
Titel: Probleme nach dem Wechsel des Ports beim Server
Hi!
Mir ist während des programmierens was komisches begegnet.
Wenn ich (in meinem Chat) die Ports der Clients (UDP und TCP - jeweils die von Indy 9) verändere, senden die TCP-, bzw. UDP-Clients ohne Probleme auf dem neuen Port.

Nur: Weder der TCP-Server, noch der UDP-Server ändern ihren Port, sie empfangen weiterhin nur auf dem alten Port.
Das komische ist, dass sich dieses Verhalten auch nicht ändere, wenn ich die Server dabei deaktiviere (active := false) oder sogar per Free und ...Create wieder neu erstelle.
Was läuft da falsch?


Narses - Mo 30.01.06 14:17

Moin!

Schau mal in Zeile 38 von Unit3, ich denke da liegt der Fehler... :roll: :wink:

cu
Narses


alias5000 - Fr 03.02.06 16:20

tja hast recht. Also ich poste mal hier den code, der die Komponenten neu erstellt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
    //Re-create Servercomponents

    //Man muss dazusagen, dass garantiert ist, dass die Server alle activ = false haben

    //MainForm.UDPServer
    MainForm.UDPServer.Free; 
    MainForm.UDPServer := TidUDPServer.Create(MainForm);
    with MainForm.UDPServer do begin
      BroadcastEnabled := true;
      DefaultPort := mbTBXSpinEdit1.Value; 
      OnUDPRead := MainForm.UDPServerUDPRead;
    end;

    //MainForm.IdUDPServer1 //Nicht wundern, ich hab tatsächlich 2 UDP Server, genauso 2 TCP Server und 2 TCP CLients
    MainForm.idUDPServer1.Free;
    MainForm.idUDPServer1 := TidUDPServer.Create(MainForm);
    with MainForm.idUDPServer1 do begin
      BroadcastEnabled := true;
      DefaultPort := mbTBXSpinEdit2.Value;
      OnUDPRead := MainForm.UDPServerUDPRead;
    end;

    //MainForm.TCPServer
    MainForm.TCPServer.Free;
    MainForm.TCPServer := TIdTCPServer.Create(MainForm);
    with MainForm.TCPServer do begin
      DefaultPort := mbTBXSpinEdit1.Value + 1;
      ThreadMgr := MainForm.IdThreadMgrDefault1;
    end;

    //MainForm.TCPServer1
    MainForm.TCPServer1.Free;
    MainForm.TCPServer1 := TIdTCPServer.Create(MainForm);
    with MainForm.TCPServer1 do begin
      DefaultPort := mbTBXSpinEdit2.Value + 1;
      ThreadMgr := MainForm.IdThreadMgrDefault1;
    end;

   Die Clients müssen nicht zwingend neu erstellt werden.
    //MainForm.TCPClient
   { MainForm.TCPClient.Free;
    MainForm.TCPClient := TidTCPClient.Create(MainForm);
    with MainForm.TCPClient do begin
      Port := mbTBXSpinEdit1.Value + 1;
      ReadTimeout := 100;
    end;}


    //MainForm.TCPClient1
  {  MainForm.TCPClient1.Free;
    MainForm.TCPClient1 := TidTCPClient.Create(MainForm);
    with MainForm.TCPClient1 do begin
      Port := mbTBXSpinEdit2.Value + 1;
      ReadTimeout := 100;
    end;}


Eigentlich finde ich diesen Code nicht zwingend nötig, da es sich eher um etwas prinzipelles handeln wird denk ich, wenn aber nicht, lass ich mich gerne mit was besserem belehren


alias5000 - Fr 03.02.06 22:22

Achso:
Das iwrd sicher net am Code liegen. Grund:
Das Projekt LanChat2 ( http://www.lanchat2.de ) hat im neuen Protokoll ja schon 3 verschiedene Clients von 3 verschiedenen Autoren.
Und: bei allen drei geht es nicht, früher ging es auch noch nie.
Und ich bin von den dreien der einzigste, der das mit neu erstellen versucht. Die beiden anderen schalten einfach nur auch activ = false und ändern den Port dann.

Das Ergebnis ist dasselbe: die Server ändern ihren Port nicht, obwohl in Port/DefaultPort der richtige drinnen steht.

Gruß alias5000


alias5000 - Mi 22.03.06 00:28

Naja, nur damit es zukünftige Leser, die dasselbe Problem haben, nicht falsche Hoffnungen bekommen: ich habs jetzt umgangen eine direkte Lösung ist nicht in Sicht. Das Programm wird neu gestartet, dnn geht es.

Gruß alias5000


Heiko - Mi 05.07.06 19:58

Man hat ja den Indy-Source, haste schonmal durchgebuggt wenne eine Anforderung an den Server kommt, ob er da auch wirklich auf den neuen Port umstellt (bei passiv)? Und zum bei aktiv-Mode, haste da mal geguckt, obs nicht auch noch einen Receive-Piort gibt? (Bei den D6 Kompos TClientSocket und TServerSocket gabs das glaub ich). Wenn ich nachher mal zeit habe, kann ich mal gucken, ob ich etwas auf Anheib finde. Zu mindestens ist es Wahrscheinlich, dass der Server zum Versenden und Empfangen verschiedene Ports nimmt.

PS. Haste schonmal Indy-10 ausprobiert?