TCP Send buffer
BlitzMax Forums/BlitzMax Programming/TCP Send buffer
| ||
| Is there any way in Max to find out how much more can be written to a TCP socket stream safely before the program will freeze until more data has been read by the client? Below is an example of the problem, build it and then run it twice. SuperStrict
Framework BRL.SocketStream
Import BRL.StandardIO
Import BRL.PolledInput
Local a%,b%
Local Server:TSocket=CreateTCPSocket(),Client:TSocket
Local ServerSt:TSocketStream,ClientSt:TSocketStream
If Not BindSocket(Server,1320)
Print "Client mode..."
CloseSocket Server
Server=Null
Client=CreateTCPSocket()
If Not ConnectSocket(Client,HostIp("localhost"),1320) Then RuntimeError "Failed to connect to "+DottedIP$(HostIp("localhost"))+":1320!"
ClientSt:TSocketStream=CreateSocketStream(Client)
Repeat
Print SocketReadAvail(Client)+" avail..."
Delay 500
Until KeyHit(1) Or AppTerminate() Or Eof(ClientSt)
Else
Print "Server mode..."
If Not SocketListen(Server) Then RuntimeError "Failed to start listening on 1320!"
Repeat
Client=SocketAccept(Server)
a=a+1
If a>49
Print "Waiting for connection..."
a=0
EndIf
Delay 10
Until Client
Print "Connection recieved, sending data..."
ServerSt:TSocketStream=CreateSocketStream(Server)
ClientSt:TSocketStream=CreateSocketStream(Client)
a=0
Repeat
For b=1 To 1024
WriteByte ClientSt,a
a=a+1
Next
Print "Sent: "+a+"..."
Until KeyHit(1) Or AppTerminate() Or Eof(ClientSt)
EndIf
If ClientSt
CloseStream ClientSt
ClientSt=Null
Client=Null
EndIf
If ServerSt
CloseStream ServerSt
ServerSt=Null
Server=Null
EndIf
Print "Cleaned up"
EndNotice how the first program (the server) stops responding after sending 32,768 bytes (approx... might vary from system to system)? This is because the second program (the client) isn't reading the data being sent to it. Now you may wonder why a client might not be reading its data... well, it could be a malicous program trying to cause this very effect to your server, or it could just be a dead connection where the Eof hasn't kicked in yet. If its a dead connection your server will carry on as soon as the connection is dropped. If its a malicious program doing it on purpose, it will remain frozen forever. AFAIK there is no way to find out how many bytes you can safely write to a stream before this will happen... I'm not even sure if its possible to find out in other languages. Does anyone know? Thanks! |
| ||
| The workaround i have. is to have static packet size. and try to kep trafic as low as possible. Try to kep a que system in server.. |