Announcement

Collapse
No announcement yet.

Probleme mit TUDPSocket

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

  • Probleme mit TUDPSocket

    Hallo,

    ich benutze (oder besser gesagt: ich würde gern benutzen) die mitgelieferte Komponente TUdpSocket um mit einer von mir aufgebauten Hardware zu kommunizieren. Ich benutze C++Builder 2007.
    Die Komponente sendet auch die richtigen Daten, allerdings immer auf dem falschen Port. Zur Überwachung des NEtzwerks verwende ich Wireshark, hier sehe ich alle Pakete und kann mir auch Source- und Destinationport betrachten.
    Hier mein Init des Sockets:

    sub=UdpSocket1->LocalHostAddr(); //get local IP
    UdpSocket1->LocalHost=sub; //and set it to udp
    Memo1->Text="Local IP is "+sub;
    UdpSocket1->LocalPort="30303";
    UdpSocket1->Active=true;
    UdpSocket1->Connect();
    if(UdpSocket1->Connected)
    Edit1->Text="UDPSocket opened and connected.";
    else
    Edit1->Text="UDPSocket opened and failed to connect.";

    Remotehost und -port hab ich zur Entwicklungszeit definiert. Die Daten kommen auch auf dem Remote an, allerdings benutzt das Mistding immer einen anderen Localport. Dieser ändert sich auch von Kompilationslauf zu Kompilationslauf.
    Des weiteren hab ich das Problem, dass das OnReceive-Event nie getriggert wird, selbst wenn die richtigen Pakete ankommen.

    void __fastcall TForm1::UdpSocket1Receive(TObject *Sender, PChar Buf,
    int &DataLen)
    {

    Memo1->Text=(AnsiString)Buf;
    }
    Hab da auch 'nen Breakpoint drin, er kommt da aber nie vorbei. Auch bei Broadcast auf dem Port 30303.
    Blockmode habe ich als bmNonBlocking definiert.

    So langsam bin ich echt am verzweifeln, hat jemand eine Idee wo das Problem liegt?

  • #2
    Kurze Antwort, da mich dieses Problem auch einen Tag gekostet hat.
    GodeGear hat mal wieder mit der heißen Nadel gestrikt und nicht richtig
    zu ende gedacht bzw. getestet.
    Wie der Name UDP schon sagt. bist du für alles selbst verantwortlich.
    1. setzen des eigenen Port funktioniert nicht, da bind(...) nicht aufgerufen wird
    Abhilfe :
    void __fastcall TSock::TCUCreateHandle(TObject *Sender)
    {
    Winsock::TSockAddrIn addr;
    addr = TCU->GetSocketAddr( TCU->LocalHostAddr(), TCU->LocalPort );
    bind( TCU->Handle, (sockaddr*)&addr, sizeof(addr) );
    }

    2. Keine Antwort in OnReceive
    Abhilfe :
    OnReceive wird erst nach ReceiveBuf aufgerufen
    Timer aktivieren und dort ReceiveBuf aufrufen
    void __fastcall TSock::TUDPTimer(TObject *Sender)
    {
    BYTE buffer[1300];
    if( TCU->Active == true )
    {
    TCU->ReceiveBuf( buffer, 1300, 0 );
    // sind keine daten da, wird OnError mit 10035 aufgerufen
    // was somit ignoriert werden kann
    // siehe http://www.bookmark-master.com/socket-error-10035.html
    }
    }
    dann ganz normal weiter in OnReceive
    void __fastcall TSock::TCUReceive(TObject *Sender, PChar Buf, int &DataLen)
    {
    AnsiString s;
    int len = DataLen;
    if( len == 0 )
    return;
    DataLen = 0; // nicht vergessen oder die größe die du aus dem puffer gelsen hast
    // der rest bleibt drinn
    .....
    }

    Denke immer drann, UDP hat nur einen 8Byte header und sendet kein ackn. etc.
    Für das verifizieren das was angekommen ist, bist du selber zuständig.



    mfg
    Fred

    Comment

    Working...
    X