Page 1 of 1

WaitNetwork

Posted: Thu Aug 20, 2009 2:32 am
by citystate
Thought I'd share a code snippet I've been finding useful

WaitNetwork.pbi

Code: Select all

Procedure WaitNetworkData(conn, length=500)
  *buff=AllocateMemory(length)
  *overbuff=AllocateMemory(length)
  While ne=0:ne=NetworkClientEvent(conn):Delay(1):Wend
  Select ne
  Case #PB_NETWORKEVENT_DATA
    ln=ReceiveNetworkData(conn,*buff,length)
    If ln=length
      Repeat:Delay(1):Until ReceiveNetworkData(conn,*overbuff,length)<length
    EndIf
  Default
    ;
  EndSelect
  FreeMemory(*overbuff)
  ProcedureReturn *buff
EndProcedure

Macro Pk(a,b)
  a=Peek#b#(*loc)
  FreeMemory(*loc)
EndMacro
  
Macro WaitNetworkByte(conn,var)
  *loc=WaitNetworkData(conn,2)
  Pk(var,B)
EndMacro  

Macro WaitNetworkChar(conn,var)
  *loc=WaitNetworkData(conn,SizeOf(Character)+1)
  Pk(var,C)
EndMacro  

Macro WaitNetworkDouble(conn,var)
  *loc=WaitNetworkData(conn,9)
  Pk(var,D)
EndMacro  

Macro WaitNetworkLong(conn,var)
  *loc=WaitNetworkData(conn,5)
  Pk(var,L)
EndMacro  

Macro WaitNetworkWord(conn,var)
  *loc=WaitNetworkData(conn,3)
  Pk(var,W)
EndMacro  

Macro WaitNetworkFloat(conn,var)
  *loc=WaitNetworkData(conn,5)
  Pk(var,F)
EndMacro  

Macro WaitNetworkQuad(conn,var)
  *loc=WaitNetworkData(conn,9)
  Pk(var,Q)
EndMacro  

Macro WaitNetworkString(conn,car,length=499)
  *loc=WaitNetworkData(conn,length+1)
  Pk(var,S)
EndMacro  
useful when you are expecting a particular response from the server

Server Code

Code: Select all

InitNetwork()
conn=CreateNetworkServer(#PB_Any,12345,#PB_Network_TCP)
If conn=0:MessageRequester("Network Error","Unable to Create Server!"):End:EndIf
OpenConsole()
PrintN("Server Started - ESC to Exit")
*buff = AllocateMemory(101)
PokeS(*buff,"S"); prefix all sent data with 'S'
Repeat
  Delay(1)
  ne=NetworkServerEvent()
  if ne
    cid = EventClient()
    If ne=#PB_NetworkEvent_Connect:PrintN("client "+str(cid)+" connected"):EndIf
    If ne=#PB_NetworkEvent_Data
      ln=ReceiveNetworkData(cid,*buff+1,100)
      SendNetworkData(cid,*buff,ln+1)
      PrintN("client "+str(cid)+" sent data - echoing")
    EndIf
    If ne=#PB_NetworkEvent_Disconnect:PrintN("client "+str(cid)+" disconnected"):EndIf
  EndIf
Until Inkey()=Chr(27)
FreeMemory(*buff)
End
Client Code

Code: Select all

IncludeFile "WaitNetwork.pbi"
InitNetwork()
conn=OpenNetworkConnection("127.0.0.1",12345,#PB_Network_TCP)
If conn=0:MessageRequester("Network Error","Unable to Create Server!"):End:EndIf
OpenConsole()
*messagedata=AllocateMemory(8)
PokeS(*messagedata,"12345678")
PrintN("Connected to Server")

SendNetworkString(conn,"Hello")
Print("Sent String 'Hello'... ")
WaitNetworkString(conn,response$)
PrintN("Received String '"+response$+"');should return 'SHello'

SendNetworkData(conn,*messagedata,1)
Print("Sent Byte '"+Str(PeekB(*messagedata))+"'... ")
WaitNetworkByte(conn,byt.b)
PrintN("Received Byte '"+Str(byt)+"');should return 83 - Chr("S")

SendNetworkData(conn,*messagedata,2)
Print("Sent Word '"+Str(PeekW(*messagedata))+"'... ")
WaitNetworkWord(conn,wrd.w)
PrintN("Received Word '"+Str(wrd)+"');should return 21297

SendNetworkData(conn,*messagedata,4)
Print("Sent Long '"+Str(PeekL(*messagedata))+"'... ")
WaitNetworkLong(conn,lng.l)
PrintN("Received Long '"+Str(lng)+"');should return 1395733043

PrintN("")
PrintN("Press Enter to Exit")
Input()

Posted: Thu Aug 20, 2009 9:54 pm
by SFSxOI
any examples of use?

Posted: Fri Aug 21, 2009 1:56 am
by citystate
updated the first post with sample code. unfortunately, I haven't had an opportunity to test it - but it should work :P