我用的是serversocket控件,servertype为stnonBlocking;
在onclientread事件里的代码是这样的
procedure TfrmMain.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tmp:String;
i,j:integer;
begin
tmp:=socket.ReceiveText;
socket.SendText('{A00000000z');
socket.Close ;
end;
服务端收到信息后要向客户端返回一个信息,现在大概有十几个客户端,每个客户端五分钟发一次数据
这样服务端运行了几天后就收不到数据了,要重起计算机后才恢复正常
请大家帮忙想想,谢谢!
在onclientread事件里的代码是这样的
procedure TfrmMain.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tmp:String;
i,j:integer;
begin
tmp:=socket.ReceiveText;
socket.SendText('{A00000000z');
socket.Close ;
end;
服务端收到信息后要向客户端返回一个信息,现在大概有十几个客户端,每个客户端五分钟发一次数据
这样服务端运行了几天后就收不到数据了,要重起计算机后才恢复正常
请大家帮忙想想,谢谢!
那是因为端口用完了。事实上,你用SOCKET.CLOSE关闭当前连接时,因为SERVERSOCKET本身存在的BUG,它只释放了当前的链接字,但它所使用的端口并没有被真正释放。因此,你系统的端口号就一真是在增加的,当系统端口无法再增加时(全都被占用时),系统通讯就无法进行了。你可以在一个事件中处理这种情况.ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin try
//-----changed on time: 2005.10.24 10:34
ErrorCode:=0;//允许系统来回收端口
socket.close;//关闭当前的链接
abort;//哑异常,直接跳出处理
except
//abort;
end;end;
是不是可以使用诸如此类的调用api的方法:
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
不过测试的时候好象time_wait不会消失,不知道为什么,可能是用错了!
下一句:
Socket.close;//这是关闭当前连接,同时会回收系统端口;