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:
1 2 3 4 5 | res = WSAStartup(&H202, WSA)
If res = -1 Then
MsgBox "Ein Fehler ist aufgetreten: " & WSAGetLastError, vbCritical, "Fehler"
Exit Function
End If
|
Socket erstellen:
1 | socketId = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
|
Binden:
1 2 3 4 5 6 7 8 9 | 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:
1 2 3 4 5 6 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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
End If
Loop
|
Vielleicht könnt ihr mir ja den entscheidenen Hinweis geben :). Vielen vielen dank!
Nils
|