三层开发碰到的问题 Error reading from socket(50分)

  • 主题发起人 主题发起人 netke
  • 开始时间 开始时间
N

netke

Unregistered / Unconfirmed
GUEST, unregistred user!
我用三层结构设计系统,当客户端一段时间(大概10到20分钟)没使用是系统就提示以下错误:
Error reading from socket.
是否跟scktsrvr里的timeout有关系,但是我已经设置成0 (0indicates infinite)。
那位兄弟帮看看,先谢了。
 
有没有人知道啊
 
我也曾遇到,不知道如何解决.GZ!
 
我也刚遇到这个问题,一筹莫展。我愿加多100分,有高手解决另开贴送上!
 
是自动跳出出错框还是触发事件后出错?
 
我的情况是,如果是大数据量传送时自动跳出,以后就不能操纵数据了。
 
自动跳出的,然后和Lop兄说的一样,不能操纵数据了。
 
修改../../../vcl/ScktMain.pas文件
 
那不是要重新编译Socket Server,有没有其他解决方法...
 
按错了,还没解决呢,解决者另外开贴给分。
 
楼主:你的问题解决了吗?
 
还没有解决啊,有什么招吗?
 
up
有人解决了吗?告我一声。yzrlz@163.com
 
我的方法比较无聊,如果出现错误,用程序让他自动重连,
 
大量发送接收数据时会出现此问题,原因是由于在发送数据时系统的数据缓冲区不足造成的,解决的方法是修改Delphi带的SCKTSRVR.EXE (在Source/Vcl中有源码)和 TSocketConnection这两个东西,主要是修改SConnect单元中的下面的发送函数,不要把包一次发出而是分多次发出。
function TSocketTransport.Send(const Data: IDataBlock): Integer;
var
P: Pointer;
begin
Result := 0;
InterceptOutgoing(Data);
P := Data.Memory;
FSocket.SendBuf(P^, Data.Size + Data.BytesReserved);
end;

把SConnect拷贝出来改个名字,如:SConnectEx,把上边的函数改为,重新编译SCKTSRVR.EXE 和你的客户端,就OK了
function TSocketTransport.Send(const Data: IDataBlock): Integer;
const
SEND_SIZE = 4096;
//每次最多发4k
var
P: Pointer;
Size, SendedSize, BufSize: Integer;
begin
Result := 0;
InterceptOutgoing(Data);
P := Data.Memory;
Size := Data.Size + Data.BytesReserved;
SendedSize := 0;
while SendedSize < Sizedo
begin
P := Pointer(LongInt(P)+SendedSize);
BufSize := Size - SendedSize;
if BufSize > SEND_SIZE then
BufSize = SEND_SIZE;
Inc(SendedSize, FSocket.SendBuf(P^, BufSize));
end;
end;
 
后退
顶部