Target was to implement a STUN client.
In Linux Mint x64 and PB 6.04 x64 it was working.
Not in WIndows 10 x64 with PB 6.04 x86 and x64
So I wrote a test program:
Code: Select all
CompilerIf Not #PB_Compiler_Thread
CompilerError "Please enable Thread safe option"
CompilerEndIf
EnableExplicit
Procedure Server(*Dummy)
Protected Server.i, *Buffer, Event.i, Client.i, Len.i, Received$, Exit.i
Server = CreateNetworkServer(#PB_Any, 3478, #PB_Network_UDP|#PB_Network_IPv6, "localhost")
If Server
Debug "Server started"
*Buffer = AllocateMemory(1024, #PB_Memory_NoClear)
If *Buffer
Repeat
Event = NetworkServerEvent(Server)
Select Event
Case #PB_NetworkEvent_None
Delay(10)
Case #PB_NetworkEvent_Data
Debug "Server event"
Client = EventClient()
Len = ReceiveNetworkData(Client, *Buffer, MemorySize(*Buffer))
If Len > 0
Received$ = PeekS(*Buffer, Len, #PB_UTF8|#PB_ByteLength)
Debug "Server received: " + Received$
Select Received$
Case "ping"
If SendNetworkString(Client, "pong") > 0
Debug "Server sent pong"
Else
Debug "Server send failed"
EndIf
Case "exit"
If SendNetworkString(Client, "bye") > 0
Debug "Server sent bye"
Else
Debug "Server send failed"
EndIf
Exit = #True
EndSelect
EndIf
EndSelect
Until Exit
FreeMemory(*Buffer)
EndIf
CloseNetworkServer(Server)
EndIf
EndProcedure
Define Thread.i, Connection.i, Event.i, State.i, Received$, *Buffer, Len.i, Timeout.q
Thread = CreateThread(@Server(), #Null)
If Thread
Delay(1000)
Connection = OpenNetworkConnection("localhost", 3478, #PB_Network_UDP|#PB_Network_IPv6)
If Connection
Debug "Connection open"
*Buffer = AllocateMemory(1024, #PB_Memory_NoClear)
If *Buffer
Timeout = ElapsedMilliseconds() + 1000 * 5 ; run max 5 seconds
Repeat
Select State
Case 0 To 2
If SendNetworkString(Connection, "ping") > 0
Debug "Client sent ping"
Else
Debug "Client send failed"
EndIf
State + 1
Case 3
If SendNetworkString(Connection, "bye") > 0
Debug "Client sent ping"
Else
Debug "Client send failed"
EndIf
State + 1
EndSelect
Received$ = ""
Repeat
Event = NetworkClientEvent(Connection)
Select Event
Case #PB_NetworkEvent_None
Debug "No client event"
Delay(500)
Case #PB_NetworkEvent_Data
Debug "Client data event"
Len = ReceiveNetworkData(Connection, *Buffer, MemorySize(*Buffer))
If Len > 0
Received$ = PeekS(*Buffer, Len, #PB_UTF8|#PB_ByteLength)
Debug "Client received: " + Received$
EndIf
EndSelect
Until Received$ <> "" Or Timeout - ElapsedMilliseconds() < 0
Until Received$ = "bye" Or Timeout - ElapsedMilliseconds() < 0
FreeMemory(*Buffer)
EndIf
CloseNetworkConnection(Connection)
Else
Debug "No connection to server"
EndIf
Else
Debug "Thread crfeate failed"
EndIf
In WIndows the server receives the ping and answer with pong, but the client gets no event.
In Linux the client send the ping, but the server get no event.
At the moment I can not test it on macOS.
Can someone with IPv6 can confirm this, or I am too stupid to code something like this?
Networking with IPv6 (espacially UDP) and PB drives me crazy.
