Hallo,
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;
begin
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};
END ELSE
   ob_sending := FALSE;
{END {IF};
end;

In the event OnDataSent I do the following:

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

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:Integer;
      li_msglen:Integer;
begin
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

end;
===========================================================================

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,

M;chael
-- 
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