Posted: Sat Aug 30, 2008 7:22 pm
You're right, it should say Bytes*SizeOf(Character).
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
; Client
Macro SendNetworkStringCorrectly(Connection, String)
SendNetworkData(Connection, @String, Len(String)*SizeOf(Character))
EndMacro
InitNetwork()
Connection = OpenNetworkConnection("127.0.0.1", 999)
Debug SendNetworkStringCorrectly(Connection, "fiver")
; if I leave this out the string isn't sent correctly for some reason.
Repeat
NetworkClientEvent(Connection)
ForEver
Code: Select all
; Server
Procedure.s ReceiveNetworkString()
#BufferSize = 1024
Protected Buffer = AllocateMemory(#BufferSize)
Protected Result.s
Repeat
Bytes = ReceiveNetworkData(EventClient(), Buffer, #BufferSize)
If Bytes > 0
Result + PeekS(Buffer, Bytes)
EndIf
Until Bytes <> #BufferSize
FreeMemory(Buffer)
ProcedureReturn Result
EndProcedure
InitNetwork()
OpenWindow(0, 100, 100, 100, 100, "Server", #PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
Connection = CreateNetworkServer(0, 999)
Repeat
Event = WaitWindowEvent(12)
Gadget = EventGadget()
Type = EventType()
Window = EventWindow()
N = NetworkServerEvent()
Select N
Case #PB_NetworkEvent_Connect
Debug "SERVER: client connected"
Case #PB_NetworkEvent_Data
Debug "SERVER: receive: " + ReceiveNetworkString()
EndSelect
Until Event = #PB_Event_CloseWindow
Code: Select all
EnableExplicit
Procedure.l SendNetworkStringUTF8(ClientID.l,String$)
Protected result.l=#False,*mem,length.l
length=StringByteLength(String$,#PB_UTF8)
If length
*mem=AllocateMemory(length)
If *mem
PokeS(*mem,String$,#PB_UTF8)
result=SendNetworkData(ClientID,*mem,length)
FreeMemory(*mem)
EndIf
EndIf
ProcedureReturn result
EndProcedure
Procedure.s ReceiveNetworkStringUTF8(ClientID.l,MaxBytes.l=32768)
Protected string$,*mem,length.l,*pos,bytes.l,total.l
length=1024
*mem=AllocateMemory(length)
If *mem
*pos=*mem
Repeat
bytes=ReceiveNetworkData(ClientID,*pos,length)
If bytes>0
total+bytes
If total<=MaxBytes
If total>MemorySize(*mem)
*pos=ReAllocateMemory(*mem,MemorySize(*mem)+length)
If *pos
*mem=*pos
*pos=*pos+total
Else
Break
EndIf
EndIf
Else
Break
EndIf
EndIf
Until bytes=0
If total
string$=PeekS(*mem,total,#PB_UTF8)
EndIf
FreeMemory(*mem)
EndIf
ProcedureReturn string$
EndProcedure
Yes, I am still wondering if that is a bug; although the fact that SendNetworkString() seems to convert to ascii first suggest that it is by design!Rook Zimbabwe wrote:I had no idea there was a unicode limitation in SendNetworkString()