Announcement

Collapse
No announcement yet.

UDP Server mit zwei Netzwerkadaptern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • UDP Server mit zwei Netzwerkadaptern

    Hallo Experten,

    ich habe einige Probleme mit der TIdUDPServer-Komponente. In meinem PC hab ich zwei Netzwerkadapter mit folgenden IP/MACID Konfigurationen:
    Adapter1: IP 192.168.240.135 MAC-ID 00...A2
    Adapter2: IP 192.168.240.199 MAC-ID 00...DB
    Für die MAC-ID hab ich jetzt nur MSB und LSB dargestellt, reicht zur eindeutigen Identifikation...

    Bevor ich zwei Adapter in meine System hatte, habe ich die Eigenschaften des UDPServers einfach in der IDE vorinitialisiert und habe mir die lokale IP mittels
    Code:
    AnsiString localIP;
    
    UDPServer1->Active=true;
    localIP=GStack->LocalAddress;
    besorgt. Anschliessend konnte ich problemlos kommunizieren.
    Jetzt versuche ich zur Laufzeit auf beide Adapter zuzugreifen und auch getrennt zu kommunizieren. In nachfolgendem Beispiel läuft die Kommunikation bereits via Adapter1. Nun versuche ich auf Adapter2 zuzugreifen. Dazu gehe ich folgendermaßen vor:
    Code:
    TStrings *Interfaces;//Strings of Networkinterfaces
    AnsiString localIP;
    
    Interfaces=GStack->LocalAddresses;
    UDPServer1->Binding->CloseSocket();
    UDPServer1->Binding->AllocateSocket(Id_SOCK_DGRAM,Id_IPPROTO_UDP);
    UDPServer1->Binding->SetBinding("192.168.240.199",30444,Id_IPv4);
    if(UDPServer1->Binding->HandleAllocated)
    	UDPServer1->Binding->Bind();
    UDPServer1->Active=true;
    localIP=GStack->LocalAddress;
    UDPServer1->Send("192.168.240.136",30444,"miau!");
    Das Resultat ist leider nicht das gewünschte. Statt das Paket aus Adapter2 rauszuschieben, sendet er es physikalisch immer noch aus Adapter1, schreibt aber in das Paket als SourceIP die 192.168.240.199 rein. Das kann man z.B. daran erkennen, das die MAC-ID im Paket immer noch 00...A2 ist.

    Wie kann ich den UDPServer dazu veranlassen den Adapter zu wechseln?

    Im Voraus Danke für die Hilfe!

    Bodo

  • #2
    Keiner eine Idee?

    Comment


    • #3
      Die Verbindung komplett beenden (active=false) bevor die Komponente mit den neuen Verbindungsdaten versorgt wird
      Christian

      Comment


      • #4
        Hallo Christian,

        das habe ich leider schon versucht.
        Code:
        UDPServer1->Send("192.168.240.136",30444,"miau1");
        UDPServer1->Active=false;
        UDPServer1->Binding->CloseSocket();      
        UDPServer1->Binding->AllocateSocket(Id_SOCK_DGRAM,Id_IPPROTO_UDP);
        UDPServer1->Binding->SetBinding("192.168.240.199",30444,Id_IPv4);
        if(UDPServer1->Binding->HandleAllocated)
        	UDPServer1->Binding->Bind();
        UDPServer1->Active=true;
        UDPServer1->Send("192.168.240.136",30444,"miau2");
        Das Resultat ist das gleiche: Das Paket "miau1" kommt aus Adapter1 mit dem korrekten Header (source IP: X.X.X.135), dass Paket "miau2" kommt ebenfalls aus dem Adapter1, wobei er hier in den Header als Source IP die X.X.X.199 reinschreibt. So langsam bin ich am Ende mit meinen Latein...

        Comment

        Working...
        X