Ich habe mal versucht, ein UDP Client-Client-Modul zu implementieren. Da dies leider nicht geklappt hat und schon sehr unhandlich wurde, habe ich ein kleines Test-Programm geschrieben.
Es besteht einzig und allein darin, an einen bestimmten Host UDP-Pakete mit Zufallszahlen zu senden. Nach dem ersten Paket sollte eigentlich der HolePunch erfolgt sein und Antworten empfangen werden können.
Als ich dieses Programm mit einem Freund auf zwei Rechnern gleichzeitig gestartet habe und wir die Rechner auf einander haben feuern lassen, ist exakt gernichts angekommen. Das Ergebnis hat mir auch ein UDP-Sniffer bestätigt.
Hier der Code:
BlitzMax: [AUSKLAPPEN] [EINKLAPPEN] SuperStrict SeedRnd MilliSecs() Local name$ Local ip% If FileType("host.txt") = 1 Then name = LoadString("host.txt") ip = HostIp(name) If Not ip Then Print "host not found" End EndIf Input "Read host: "+name+" Press [Return] to continue " Else name = Input("The other's host >") ip = HostIp(name) If Not ip Then Print "host not found" End EndIf SaveString name, "host.txt" EndIf Const PORT% = 4242 Local socket:TSocket = CreateUDPSocket() Assert socket, "Unable to create socket" Assert BindSocket(socket, PORT), "Unable to start listening" Assert ConnectSocket(socket, ip, PORT), "Unable to connect" Local bank:TBank = CreateBank(1) Local timer:TTimer = CreateTimer(20) For Local i%=0 Until 500 Local b:Byte = Rand(0, 255) WaitTimer timer PokeByte bank, 0, b Print "send message ("+b+")..." If Not SWrite(socket, bank) Then Print "Could not write..." Input "Press [Return] to end...~n" End EndIf Local res:TBank = SRead(socket) For Local i%=0 Until BankSize(res) Local val:Byte = PeekByte(res, i) Print "RESPONSED: "+val Next Next StopTimer timer CloseSocket socket Input "Press [Return] to end...~n"
Function SRead:TBank(socket:TSocket, bufferSize%=1024) Local buf:Byte[bufferSize], rip%, rport% Local receivedLen% Local ip% = SocketRemoteIP(socket), port% = SocketRemotePort(socket) receivedLen = 0 If socket.Connected() Then Local size% = socket.ReadAvail() If size Then receivedLen = recvfrom_(socket._socket, buf, size, 0, rip, rport) If (rip <> ip) Or (rport <> port) Then receivedLen = 0 EndIf EndIf If receivedLen > 0 Then Return CreateStaticBank(buf, receivedLen) Return CreateBank(0) End Function
Function SWrite%(socket:TSocket, bank:TBank) Local size% = BankSize(bank) Local buf:Byte Ptr = LockBank(bank) Local ip% = SocketRemoteIP(socket), port% = SocketRemotePort(socket) Local sent% = sendto_(socket._socket, buf, BankSize(bank), 0, ip, port) UnlockBank bank Return sent End Function
Habe ich beim Konzept, bei der Implementierung oder bei der Wahl der Programmiersprache einen Fehler gemacht? Eine Skype-Verbindung läuft jedenfalls.
ZEVS
|