Hallo Leute,
ich probiere grademit den Winsock Api Funktionen unter Access 2013.
Ich suche einen Server, indem ich eine UDP Nachricht per UDP an 255.255.255.255 rausschicke. Über Wireshark kann ich sehen, dass die Nachricht rausgeht und auch die entsprechende Antwort vom Server tatsächlich gesendet wird. Der Socket, Winsock wird ordentlich geöffnet und geschlossen.
Allerdings kriege ich es nicht gebacken die Server antwort mit recv(from) auszulesen. Der Puffer ist bei recv und recvfrom immer leer. [u]Auf TCP Basis kann ich die Nachrichten mit unten stehender Funktion auslesen!
Mein Code sieht folgendermaßen aus:
Ausführender Code:
mmc_connect "255.255.255.255", True
Wait 100
send_c "HELLO MMC102"
Wait 100
mmc_disconnect Verbindiung herstellen:
Sub mmc_connect(IP As String, udp As Boolean)
Dim WSA As WSAData
Dim I_SocketAddress As sockaddr_in
Dim ipAddress As Long
Dim bNonBlock As Long
Dim bind_addr As sockaddr_in
res = WSAStartup(&H202, WSA)
If res = -1 Then
MsgBox "Ein Fehler ist aufgetreten: " & WSAGetLastError, vbCritical, _
"Fehler"
Exit Sub
End If
'Create a new socket
If udp = False Then
socketId = socket(AF_INET, SOCK_STREAM, 0)
Else
socketId = socket(AF_INET, SOCK_DGRAM, 0)
End If
If socketId = SOCKET_ERROR Then
MsgBox ("ERROR: socket = " + Str$(socketId))
OpenSocket = COMMAND_ERROR
Exit Sub
End If
If udp = True Then
Dim value As Integer
value = 1
res = setsockopt(socketId, SOL_SOCKET, SO_BROADCAST, value, 1)
If res = -1 Then
MsgBox "Ein Fehler ist aufgetreten: " & WSAGetLastError, _
vbCritical, "Fehler"
Exit Sub
End If
' 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: " & WSAGetLastError,
' vbCritical, "Fehler"
' Exit Sub
' End If
End If
'Open a connection to a server
I_SocketAddress.sin_family = AF_INET
I_SocketAddress.sin_port = htons(10102)
I_SocketAddress.sin_addr = inet_addr(IP)
I_SocketAddress.sin_zero = String$(8, 0)
x = connect(socketId, I_SocketAddress, Len(I_SocketAddress))
If socketId = SOCKET_ERROR Then
MsgBox ("ERROR: connect = " + Str$(x))
OpenSocket = COMMAND_ERROR
Exit Sub
End If
'bNonBlock = 1;
ioctlsocket socketId, FIONBIO, 1
OpenSocket = socketId
End Sub String senden:
Sub send_c(text As String)
Dim strSend As String
strSend = text
count_it = send(socketId, ByVal strSend, Len(strSend), 0)
If count_it = SOCKET_ERROR Then
MsgBox ("ERROR: send = " + Str$(count_it))
SendCommand = COMMAND_ERROR
Exit Sub
End If
SendCommand = NO_ERROR
End Sub Verbindung schließen:
Sub mmc_disconnect()
x = closesocket(socketId)
If x = SOCKET_ERROR Then
MsgBox ("ERROR: closesocket = " + Str$(x))
Exit Sub
End If
x = WSACleanup()
End Sub Daten empfangen (recv statt recvfrom):
Dim c As String * 1
Dim dataBuf As String
Dim length As Integer
Dim I As Integer
maxLength = 1000
dataBuf = ""
Do While length < maxLength
count_it = recv(socketId, c, 1, 0)
If count_it < 1 Then
Exit Do
End If
length = length + count_it
dataBuf = dataBuf + c
Loop
r_text = dataBuf Wenn ihr mir das helfen könntet, wäre ich da sehr dankbar!
mfg
Nils
Beitrag wurde zuletzt am 10.09.14 um 09:34:10 editiert. |