Below is a network server. It has a global variable SendSize which you can use to set the size of the data you wish it to send to the client. I have set it to 250,000 just so we're testing with a number > 65,535
I have also included a client which requests the data from the server and displays the size of the response.
I'm running this on Pop!_OS and I'm not seeing any restriction on the size of data I can send and receive.
Server:
Code: Select all
EnableExplicit
Enumeration
#frmMain
#frmMain_edtNarrative
EndEnumeration
Enumeration server
#NetworkServer
EndEnumeration
Global SendSize = 250000
Global Port.i = 8081
Global BufferSize.i = 2048
Global *Buffer = AllocateMemory(BufferSize)
Global ChunkSize.i = 0
Global NewMap MyMap.s()
Procedure.s GetIP()
Protected sIP.s = "127.0.0.1"
If ExamineIPAddresses()
Repeat
Protected IP = NextIPAddress()
If IP
sIP = IPString(IP)
EndIf
Until IP = 0
EndIf
ProcedureReturn sIP
EndProcedure
Procedure AddIncomingData(nClientId, sData.s)
If Not FindMapElement(MyMap(), Str(nClientId))
AddMapElement(MyMap(), Str(nClientId))
EndIf
MyMap() + sData
EndProcedure
Procedure onRequest(nClientId)
Protected sMode.s = "header_f"
If FindMapElement(MyMap(), Str(nClientId))
sMode = MyMap()
DeleteMapElement(MyMap(), Str(nClientId))
EndIf
Protected sResponse.s = ""
sResponse = RSet(sResponse, SendSize, "x")
Protected nContentLength = StringByteLength(sResponse, #PB_UTF8)
If FindString(sMode, "header_t") > 0
sResponse = "HTTP/1.1 200 OK" + #CRLF$ +
"Content-Type: text/plain" + #CRLF$ +
"Content-Length: " + Str(nContentLength) +
#CRLF$ + #CRLF$ + sResponse
EndIf
AddGadgetItem(#frmMain_edtNarrative, -1, "Content-Length " + Str(nContentLength) + " bytes ...")
SendNetworkString(nClientId, sResponse, #PB_UTF8)
AddGadgetItem(#frmMain_edtNarrative, -1, "Done" + #CRLF$)
EndProcedure
Procedure frmMain_Open()
Protected sTitle.s = "Listening at " +
GetIP() + ":" +
Str(Port)
If OpenWindow(#frmMain, 20, 20, 600, 300, sTitle)
EditorGadget(#frmMain_edtNarrative, 10, 10, 580, 280)
EndIf
EndProcedure
If Not CreateNetworkServer(#NetworkServer, Port)
Debug "Failed to create network server. Is port " + Str(Port) + " in use?"
End
EndIf
frmMain_Open()
Define.i ServerEvent, WindowEvent, ClientID
Define.s sRequest
Repeat
WindowEvent = WaitWindowEvent(20)
ServerEvent = NetworkServerEvent(#NetworkServer)
If ServerEvent
ClientID = EventClient()
Select ServerEvent
Case #PB_NetworkEvent_Connect
Case #PB_NetworkEvent_Disconnect
Case #PB_NetworkEvent_Data
ChunkSize = ReceiveNetworkData(ClientID, *Buffer, BufferSize)
AddIncomingData(ClientID, PeekS(*Buffer, ChunkSize, #PB_UTF8))
If ChunkSize < BufferSize
onRequest(ClientID)
EndIf
EndSelect
Else
Delay(20)
EndIf
Until WindowEvent = #PB_Event_CloseWindow
CloseNetworkServer(#NetworkServer)
Client:
Code: Select all
EnableExplicit
Enumeration
#frmMain
#frmMain_btnNoHeader
#frmMain_btnHeader
#frmMain_edtNarrative
EndEnumeration
Global IP.s = "127.0.0.1"
Global Port = 8081
Global BufferSize = 2048
Global *Buffer = AllocateMemory(BufferSize)
Procedure frmMain_Open()
If OpenWindow(#frmMain, 20, 20, 600, 300, "Client")
ButtonGadget(#frmMain_btnNoHeader, 10, 10, 100, 25, "Plain")
ButtonGadget(#frmMain_btnHeader, 120, 10, 100, 25, "HTTP")
EditorGadget(#frmMain_edtNarrative, 10, 40, 580, 250)
EndIf
EndProcedure
Procedure onBtn_Header()
Protected req = HTTPRequest(#PB_HTTP_Get, "http://" + IP + ":" + Str(Port) + "/header_t")
If req
AddGadgetItem(#frmMain_edtNarrative, -1, HTTPInfo(req, #PB_HTTP_Headers))
FinishHTTP(req)
Else
AddGadgetItem(#frmMain_edtNarrative, -1, "HTTP request failed")
EndIf
EndProcedure
Procedure onBtn_NoHeader()
Protected Quit = 0
Protected ChunkSize = 0
Protected TotalBytes = 0
Protected ConnectionID = OpenNetworkConnection(IP.s, Port)
If ConnectionID
SendNetworkString(ConnectionID, "header_f", #PB_UTF8)
Repeat
Protected ClientEvent = NetworkClientEvent(ConnectionID)
If clientEvent
Select ClientEvent
Case #PB_NetworkEvent_Data
ChunkSize = ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
TotalBytes + ChunkSize
If ChunkSize < BufferSize
AddGadgetItem(#frmMain_edtNarrative, -1, "Received " + Str(TotalBytes) + " bytes")
Quit = 1
EndIf
Case #PB_NetworkEvent_Disconnect
AddGadgetItem(#frmMain_edtNarrative, -1, "Server closed the connection")
Quit = 1
EndSelect
EndIf
Until Quit = 1
CloseNetworkConnection(ConnectionID)
Else
AddGadgetItem(#frmMain_edtNarrative, -1, "Connection failed")
EndIf
EndProcedure
Procedure Events_Gadget()
Select EventGadget()
Case #frmMain_btnHeader
onBtn_Header()
Case #frmMain_btnNoHeader
onBtn_NoHeader()
EndSelect
EndProcedure
BindEvent(#PB_Event_Gadget, @Events_Gadget())
frmMain_Open()
Define WindowEvent
Repeat
WindowEvent = WaitWindowEvent(20)
Until WindowEvent = #PB_Event_CloseWindow
* Edit *
On my PC the largest SendSize that worked reliably seemed to be 5,000,000 bytes.
Out of curiosity I might tweak the server to respond using chunked transfer encoding and see if there's a limit to PB's HTTPRequest()
