一台公网服务器中转两台不同内网电脑的TCP文件传输,公网服务器用:ServerSocket1 模式:stNonBlocking
内网电脑用ClientSocket1 模式也是:ctNonBlocking
部分源码://全局变量设置:
var
Sok2:TCustomWinSocket;
MyBuffer: array[0..99999] of byte; {设置接收缓冲区}//公网服务器收到客户端连接的时候,建立socket套接字
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
beginSok2:=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会把一个整大包分成很多小包进行传输,第一个小包可以顺利转发,第二个,第三个,后面的小包,就不行了,发不出去,我用了线程处理,也发不了去。各位高手一定明白其中的道理,就是接收太快了,发送太慢了,请问一般是用什么办法来进行顺利转发的?
内网电脑用ClientSocket1 模式也是:ctNonBlocking
部分源码://全局变量设置:
var
Sok2:TCustomWinSocket;
MyBuffer: array[0..99999] of byte; {设置接收缓冲区}//公网服务器收到客户端连接的时候,建立socket套接字
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
beginSok2:=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会把一个整大包分成很多小包进行传输,第一个小包可以顺利转发,第二个,第三个,后面的小包,就不行了,发不出去,我用了线程处理,也发不了去。各位高手一定明白其中的道理,就是接收太快了,发送太慢了,请问一般是用什么办法来进行顺利转发的?
解决方案 »
- delphi做了个excel导入ACCESS的功能,怎么老是提示找不到ACCESS数据库?
- 请教熟悉dbgrideh的高手帮忙解决设置字体的问题
- dll封装mdi问题,在线等,很急!!!!
- 那位有ftp 站点 给提供些 要有用户名和密码
- 下面代码(vb)用delphi如何表达!
- DBGrid能不能用程序直接一行一行赋值?(不给DataSource赋值)
- 大虾们,急救呀~~~~~~~这是一个小的调用存储过程的东西,可惜运行时候报错~
- 如何控制那个黄色的小帮助信息,显示与消失。
- sql2000查询问题
- 如何保证,窗体切换时,看起来不闪烁!
- 跪求一段Javascript转换成Delphi的函数
- delphi 7 ,delphi2010 那个不错
begin
Stream.WriteBuffer(buf, SizeOf(Buf));
end;Sok2.SendStream(Stream, Stream.Size);