公网服务器用:ServerSocket1 模式:stNonBlocking
内网电脑用ClientSocket1 模式也是:ctNonBlocking
部分源码:
//全局变量设置:
var
Sok2:TCustomWinSocket;
MyBuffer: array[0..99999] of byte; {设置接收缓冲区}
//公网服务器收到客户端连接的时候,建立socket套接字
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Sok2:=Socket;
end;
//公网服务器接收的时候,立即进行转发
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
len, t: Integer;
begin
t := Socket.ReceiveLength;
len := Socket.ReceiveBuf(MyBuffer, t);
Sok2.SendBuf(MyBuffer, len); //出错的地方,转发不完整,掉包。
//注明:我把上面这句话放到线程里面处理,转发也同样不完整,掉包。
end;
问题在公网服务器接收立即进行转发,因为TCP会把一个整大包分成很多小包进行传输,第一个小包可以顺利转发,第二个,第三个,后面的小包,就不行了,发不出去,我用了线程处理,也发不了去。
各位高手一定明白其中的道理,就是接收太快了,发送太慢了,请问一般是用什么办法来进行顺利转发的?