十分有趣!关于Socket的问题,望大家帮帮忙,很急,先谢了!(200分)

  • 主题发起人 主题发起人 cy408
  • 开始时间 开始时间
C

cy408

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ClientSocket写了一个客户端程序,本程序与服务端通讯,若发生通讯异常
(包括服务端关机等),则客户端自动与服务端相连接,其连接过程如下:
当产生OnError事件时,关闭Socket连接,并激活定时器(10S),在定时器中,
重新Open Socket,同时关闭Socket连接,至到连接到服务端为至。本程序运行
一段时间后(大约一个小时),将产生一个“10055”错(No buffer space available)
请问各位大侠,我应当怎样解决,在OnError事件中,我已设ErrorCode:=0
 
你试一下:timer中,在前面create
完成Open Socket和关闭Socket连接之后,将clientsocket.free。
 
用setsockopt函数将SO_DONTLINGER设置一下。我做多线程也碰上过类似的问题。
 
_ghost:
你说的方法我已采用过了,问题同样存在。
nunimao:
 你能否说详细一点。setsockopt怎样用,是API?还望多指点!
 
各位,帮帮忙啊,我急!
以上方法我已采用过了,一样不能解决问题。
 
你用过setsockopt了吗?因为你的socket是异常关闭,所以它的buffer里的内容都是linger(保留),只要线程一多,就会
No buffer space available!。所以,将socket设成SO_DONTLINGER就行。参看win api说明
 
nunimao兄:
  谢谢你,这种方式我已试过,问题依然存在,还望给予指点。

 
丢掉ClientSocket吧,用API,Socket很简单,(50行)
 
system_owen兄:
 先谢谢你,关于对Socket API我不是很熟悉,还望给予指点。
 
按照这种方法我运行了3个小时没出错。
procedure TForm1.FormCreate(Sender: TObject);
begin
Flag1:=true;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrrorCode:=0;
Flag2:=true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not ClientSocket1.Active and (Flag1 or Flag2) then
begin
Flag2:=false;
ClientSocket1.Socket.Close;
ClientSocket1.Active:=true;
end
else
if ClientSocket1.Active then
begin
Timer1.Enabled:=false;
ShowMessage('sucess');
end;
Flag1:=false;
end;

另外,我以为,客户端最好用重叠IO模型;服务端必用完成端口重叠IO操作模型。
但不论是delphi自带还是第三方组件(如indy,ics)都没有采用以上技术。所以他们
只适用于客户端。
 
何为重叠IO模型?望给予指点,谢谢!!!!
你的程序我只有明天在单位上试一试。
 
终于找到同志了
我的被这个问题困绕很久了,
希望大家能够解决
我也提了个问题在这里。问题是一样的:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=800527
 
后退
顶部