I am using the ICS now for a long time, but there is one problem which I wasn't 
able to solve.
Now I hope there is somebody outside, who can give me "illumination" ;-). I try 
to explain this very detailled, sorry for the large mail.

I send many messages via SendStr. They can be very large (about 100KB each).

At first my implementation:

I use a method called SendNext:

procedure Tnvc_AsyncBufferedClientSocket.SendNext;
IF (osl_SendMessages.Count > oi_nextsend) THEN BEGIN
   IF NOT ob_sending THEN BEGIN
      ob_sending := TRUE;
      oSock_Client.SendStr (osl_SendMessages.Strings[oi_nextsend]);
        inc (oi_nextsend);
   END {IF};
   ob_sending := FALSE;
{END {IF};

In the event OnDataSent I do the following:

procedure Tnvc_AsyncBufferedClientSocket.Socket_OnDataSent(Sender: TObject; 
ErrCode: Word);
ob_sending := FALSE;

On the receiving side I use the DataAvailable event looking like this

procedure tnvc_DBGatewayServerClientConnection.ConnectionDataAvailable(Sender: 
TObject; Error : Word);
VAR   Buffer : array [0..4096] of char;
        ls_receive, ls_msg:String;
li_rec                  := Receive (@Buffer, SizeOf(Buffer));
os_newMessage   := copy (buffer,1, li_rec);

oi_len := oi_len + Length (os_newMessage);
os_Message := os_Message + os_newMessage;

//Process os_message


Now the problem:
If I am using this in a local network everything works fine. That means all 
data which was sent will be received.
If I use this over the internet I lose many packets. And I don't know why. 
As I thought the SendStr-procedure works with an internal buffer, which 
guarantees that all messages which were sent will be received right on the 
other side?

In an other implementation I do a "SendBlock". that means, I divide my Message 
in tcp-Blocks (around 1400 Bytes per Block) and wait for an OnDataSent after 
each block. This seems to work without losses.
The problem is, that I need to have the sending asyncron, means the application 
has to handle incoming messages during sending, so I must implement my own 
thread handling - this I would like to avoid.

I know, the description is a little bit confused, but I hope you understand my 
problem and maybe you have own experiences how to implement a tcp-send/receive 
where it is guaranteed that all messages which are sent will be received.

Thanks for any hints,

To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to