UDP HolePunch - was mache ich falsch?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

ZEVS

Betreff: UDP HolePunch - was mache ich falsch?

BeitragDo, Dez 22, 2011 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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]
SuperStrict
SeedRnd MilliSecs() 'Zufallszahlen
Local name$
Local ip% 'Versuche, den Hostnamen aus einer Datei zu lesen, sonst per Eingabe
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
'=> ip enthält nun die IP. Eine Überprüfung hat stattgefunden
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"
'Kein Fehler...
Local bank:TBank = CreateBank(1) 'Speichert die Zahlen
Local timer:TTimer = CreateTimer(20) '20x in der Sekunde eine Nachricht senden
For Local i%=0 Until 500 '500 Nachrichten senden
Local b:Byte = Rand(0, 255)
WaitTimer timer
PokeByte bank, 0, b 'Zufallszahl eintragen
Print "send message ("+b+")..."
'schreiben...
If Not SWrite(socket, bank) Then
Print "Could not write..."
Input "Press [Return] to end...~n"
End
EndIf
Local res:TBank = SRead(socket) 'auslesen
For Local i%=0 Until BankSize(res)
Local val:Byte = PeekByte(res, i)
'If i = 0 And val = b Then Continue
Print "RESPONSED: "+val
Next
Next
StopTimer timer 'aufräumen
CloseSocket socket
Input "Press [Return] to end...~n"

Function SRead:TBank(socket:TSocket, bufferSize%=1024) 'Lese möglichst viele Bytes aus dem Socket aus
'(max bufferSize)
Local buf:Byte[bufferSize], rip%, rport% 'buffer, remote-ip, remote-port
Local receivedLen%
Local ip% = SocketRemoteIP(socket), port% = SocketRemotePort(socket) 'Werte auslesen
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 'Falsche Nachricht
EndIf
EndIf
If receivedLen > 0 Then Return CreateStaticBank(buf, receivedLen)
Return CreateBank(0)
End Function

Function SWrite%(socket:TSocket, bank:TBank) 'Schreibe eine Bank in ein Socket
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group