Thema Datum  Von Nutzer Rating
Antwort
Rot Winsock: UDP kein Empfang mit recvfrom
18.09.2014 09:03:06 Nils
NotSolved
18.09.2014 09:09:27 Nils
NotSolved

Ansicht des Beitrags:
Von:
Nils
Datum:
18.09.2014 09:03:06
Views:
16276
Rating: Antwort:
  Ja
Thema:
Winsock: UDP kein Empfang mit recvfrom

Hallo an alle,

ich hoffe, dass man mir vielleicht hier ein wenig helfen kann:

Ich programmiere grade eine Funktion zum Auffinden eines Servers. Ich schicke einen Text als UDP Broadcast und warte auf die Antworten der vorhandenen Server.

Mein Problem ist nun, dass meine Nachricht erfolgreich per UDP verschickt wird, der Server auch die tatsächliche Antwort sendet, ich aber stets mit recvfrom einen leeren Eingangspuffer habe, also gar nix empfange.

Dass die Nachrichten wirklich verschickt werden habe ich mit Wireshark überprüft. VBA ist CaseSensitive, das habe ich beachtet und daran wird der Fehler auch nicht liegen.

Ich habe den Verdacht, dass ich eine Funktion nicht richtig aufrufe, die falsche Reihenfolge, was wcithiges verlasse oder dergleichen die Ursache ist.

Ich mache folgende Reihenfolge:

- WSA initialisieren

- Socket erstellen

- Socket binden (an 0.0.0.0:10102 - ich will ja alles auf dem Port empfangen)

- Sento: an 255.255.255.255:10102 die Nachricht schicken (erfolgreich - siehe Wireshark)

- recvfrom: antworten an Port 10102 empfangen (Wireshark: Nachrichten werden an mich an diesen Port tatsächlich gesendet, aber recvfrom ist immer leer)

- Socket und WSA schließen

Threads gibt es ja so nicht in VBA. Der Verdacht könnte auch sein, dass die UDP nachricht verworfen werden oder ich tatsächlich zu früh lesen will. Ich habe den Socket auf nicht-blockierend eingestellt. Hier die Codeteile:

WSA init:

    res = WSAStartup(&H202, WSA)
    If res = -1 Then
        MsgBox "Ein Fehler ist aufgetreten: " & WSAGetLastError, vbCritical, "Fehler"
        Exit Function
    End If

Socket erstellen:

socketId = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

Binden:

bind_addr.sin_family = AF_INET
        bind_addr.sin_port = htons(10102)
        bind_addr.sin_addr = inet_addr("192.168.178.110")
        bind_addr.sin_zero = String$(8, 0)
        res = bind(socketId, bind_addr, Len(bind_addr))
        If res = -1 Then
            MsgBox "Ein Fehler ist aufgetreten (bind): " & WSAGetLastError, vbCritical, "Fehler"
            Exit Function
        End If

Senden:

send_addr.sin_family = AF_INET
        send_addr.sin_port = htons(10102)
        send_addr.sin_addr = inet_addr("255.255.255.255")
        send_addr.sin_zero = String$(8, 0)

        count_it = sendto(socketId, ByVal text, Len(text), 0, send_addr, Len(send_addr))

Empfangen:

     Dim dataBuf As String * 1000
    Dim length As Long
    Dim GotData As sockaddr_in
    Dim dummy As Long
    
    maxLength = 20
    length = 0

    Do While length < maxLength
        count_it = recvfrom(socketId, dataBuf, Len(dataBuf), 0, GotData, Len(GotData))
        
        If count_it < 1 Then
            Exit Do
        End If

        If dataBuf = "MMC102 BY TUD" Then
            MsgBox 1
           ' ipliste.AddColon CStr(GotData.sin_addr)
        End If
        
    Loop

Vielleicht könnt ihr mir ja den entscheidenen Hinweis geben :). Vielen vielen dank!

Nils


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot Winsock: UDP kein Empfang mit recvfrom
18.09.2014 09:03:06 Nils
NotSolved
18.09.2014 09:09:27 Nils
NotSolved