IPv6 and IPv4 usage have a design flaw
Posted: Sun Jan 10, 2016 8:05 pm
calling anything with #PB_Network_IPv4 when IPv6 or #PB_Network_IPv6 when IPv4 causes memory corruption. FreeIP() causes memory corruption when used on IPv4. There is a either/or strict usage case and no way to detect which before you have to actually use those strict cases.
My Suggestion: Get rid of parameters and FreeIP() completely and handle internally or redesign and add something for version detection.
My Suggestion: Get rid of parameters and FreeIP() completely and handle internally or redesign and add something for version detection.
Code: Select all
;small server with UI to demo the IPv6 problem. Connect with IPv4
Global tstate.b
Define.l event,gadget,etype
Declare server(*val)
If OpenWindow(0,0,0,600,400,"IP test",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
ListViewGadget(0,0,0,WindowWidth(0),WindowHeight(0)-30)
ButtonGadget(1,WindowWidth(0)-100,WindowHeight(0)-26,99,25,"Start Server")
Repeat
event=WaitWindowEvent()
gadget=EventGadget()
etype=EventType()
If event=#PB_Event_Gadget
Select gadget
Case 1
If tstate=#False
CreateThread(@server(),1)
Else
tstate=#False
EndIf
EndSelect
EndIf
Until event=#PB_Event_CloseWindow
HideWindow(0,1)
tstate=#False
Delay(2000)
EndIf
End
Procedure server(*val)
If InitNetwork()
Define *Buffer = AllocateMemory(1000)
Define.l bsize
Define.s netdata$
If CreateNetworkServer(0,666)
SetGadgetText(1,"Stop Server")
Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case #PB_NetworkEvent_Connect
AddGadgetItem(0,-1,IPString(GetClientIP(ClientID),#PB_Network_IPv6)+" connected")
FreeIP(GetClientIP(ClientID))
Case #PB_NetworkEvent_Data
Repeat
bsize=ReceiveNetworkData(ClientID,*Buffer,1000)
netdata$=netdata$+Trim(PeekS(*Buffer,1000))
If bsize<MemorySize(*Buffer)
Break
EndIf
ForEver
FreeMemory(*Buffer) : *Buffer=AllocateMemory(1000)
AddGadgetItem(0,-1,IPString(GetClientIP(ClientID),#PB_Network_IPv6)+" sent:"+netdata$)
FreeIP(GetClientIP(ClientID))
netdata$=""
Case #PB_NetworkEvent_Disconnect
AddGadgetItem(0,-1,IPString(GetClientIP(ClientID),#PB_Network_IPv6)+" disconnected")
FreeIP(GetClientIP(ClientID))
EndSelect
EndIf
Until tstate=#False
CloseNetworkServer(0)
FreeMemory(*Buffer)
SetGadgetText(1,"Start Server")
EndIf
EndIf
EndProcedure