10055错误: WSAENOBUFS(10055)No buffer space available. An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
To: Thumb168(大母指) 为什么我认为是Socket句柄(SocketHandle)资源用尽的问题呢?因为我曾在OnTimer事件里监视过ClientSocket1.Socket.SocketHandle 。 procedure TFrom1.Timer1Timer(Sender: TObject); begin if not ClientSocket1.Active then ClientSocket1.Active := True; // 曾在此处以写Log日志文件方式监视过程序运行过程 // 中ClientSocket1.Socket.SocketHandle,发现此值每次总会以+2~+8 // 速度递增,最后达到3万多的时候就是程序出错之时。 end; 在Timer触发事件里创建TClientSocket、进行连接,还要释放,再退出OnTimer?这好像有点奇怪,因为连接成功与否要通过TClientSocket的OnConnect、OnError事件被触发来得知的啊!你的意思是一旦TClientSocket的实例被释放,它所使用过的资源(比如SocketHandle)也就还给系统可以重新分配使用了?
不要用Timer控件,改用线程去做. 在线程里循环进行连接,每次连接前等待一个事件,这个事件由TClientSocket.OnError中的代码触发,直到连接成功或线程被终止.以保证每次连接时,上一次的连接已经断开. ____ ____ \ p \ / g / \ l \_/ n / \ a o / \ i s / \ n / \_/
to hieefxz(凡人邪真) 你的方法是不行的,这种在onerror事件中和在ontimer中 尝试重连接又有何区别呢?只是你连接的次数少而已,我早就是过了,你可以把server关掉,然后在onerror事件中如果errorcode=10061就不断重联,30--70次保证程序down掉!
To: plainsong(轻风) 你说的方法我试过的,使用Timer还是使用线程都可以(Timer本身就是一个线程)。我是这么做的:在OnTimer事件里再多判断一个条件(即本次连接是否完成): procedure TFrom1.Timer1Timer(Sender: TObject); begin if not ClientSocket1.Active and not F_Connecting then begin F_Connecting := True; ClientSocket1.Active := True; end; end;在ClientSocket1的OnError和OnDisconnect事件中增加一行: F_Connecting := False; // 本次连接结束,可以再次进行连接。结果还是一样的,也许如同“Thumb168(大母指)”所说,只要TClientSocket未消亡,它所用过的SocketHandle就不会释放?
To: plainsong(轻风) 你说的方法我试过的,使用Timer还是使用线程都可以(Timer本身就是一个线程)。我是这么做的:在OnTimer事件里再多判断一个条件(即本次连接是否完成): procedure TFrom1.Timer1Timer(Sender: TObject); begin if not ClientSocket1.Active and not F_Connecting then begin F_Connecting := True; ClientSocket1.Active := True; end; end;在ClientSocket1的OnError和OnDisconnect事件中增加一行: F_Connecting := False; // 本次连接结束,可以再次进行连接。结果还是一样的,也许如同“Thumb168(大母指)”所说,只要TClientSocket未消亡,它所用过的SocketHandle就不会释放?
To: 猛禽>直至连上后再断开,改回NonBlocking方式 这么做有点牵强,如果一连接上,Server就要主动向Client发送数据呢?你的意思是说如果两端都用Blocking方式就没有问题了?
TO: lizhenjia(暴雪)> 10055错误: > WSAENOBUFS > > (10055) > > No buffer space available. > > An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.你在哪里找到指定错误号的解释的?我怎么在Help里找不到?
因为出现这种问题的原因是客户机的缓冲区或者队列满了,系统缺乏资源,如果在连接下去windows离down就不远了.纤细请查看sdk帮助.
WSAENOBUFS(10055)No buffer space available. An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
为什么我认为是Socket句柄(SocketHandle)资源用尽的问题呢?因为我曾在OnTimer事件里监视过ClientSocket1.Socket.SocketHandle 。
procedure TFrom1.Timer1Timer(Sender: TObject);
begin
if not ClientSocket1.Active then ClientSocket1.Active := True;
// 曾在此处以写Log日志文件方式监视过程序运行过程
// 中ClientSocket1.Socket.SocketHandle,发现此值每次总会以+2~+8
// 速度递增,最后达到3万多的时候就是程序出错之时。
end;
在Timer触发事件里创建TClientSocket、进行连接,还要释放,再退出OnTimer?这好像有点奇怪,因为连接成功与否要通过TClientSocket的OnConnect、OnError事件被触发来得知的啊!你的意思是一旦TClientSocket的实例被释放,它所使用过的资源(比如SocketHandle)也就还给系统可以重新分配使用了?
在线程里循环进行连接,每次连接前等待一个事件,这个事件由TClientSocket.OnError中的代码触发,直到连接成功或线程被终止.以保证每次连接时,上一次的连接已经断开. ____ ____
\ p \ / g /
\ l \_/ n /
\ a o /
\ i s /
\ n /
\_/
form1.ContinueConnect
begin
clientsocket.active:=false;
try
clientsocket.address:='127.0.0.1';
clientsocket.port:=6677;
clientsocket.active:=true;
except
abort;
end;
end;
该过程在错误处理中调用,我试过了是可以的。
就是server关闭时,
要在Disconnetion事件中再进行处理。
你的方法是不行的,这种在onerror事件中和在ontimer中 尝试重连接又有何区别呢?只是你连接的次数少而已,我早就是过了,你可以把server关掉,然后在onerror事件中如果errorcode=10061就不断重联,30--70次保证程序down掉!
procedure TFrom1.Timer1Timer(Sender: TObject);
begin
if not ClientSocket1.Active and not F_Connecting then
begin
F_Connecting := True;
ClientSocket1.Active := True;
end;
end;在ClientSocket1的OnError和OnDisconnect事件中增加一行:
F_Connecting := False; // 本次连接结束,可以再次进行连接。结果还是一样的,也许如同“Thumb168(大母指)”所说,只要TClientSocket未消亡,它所用过的SocketHandle就不会释放?
procedure TFrom1.Timer1Timer(Sender: TObject);
begin
if not ClientSocket1.Active and not F_Connecting then
begin
F_Connecting := True;
ClientSocket1.Active := True;
end;
end;在ClientSocket1的OnError和OnDisconnect事件中增加一行:
F_Connecting := False; // 本次连接结束,可以再次进行连接。结果还是一样的,也许如同“Thumb168(大母指)”所说,只要TClientSocket未消亡,它所用过的SocketHandle就不会释放?
procedure TFrom1.Timer1Timer(Sender: TObject);
begin
try
clientsocket.open;
Timer1.Enable := False;
except
ClientSocket.Close;
end;
end;ClientSocketOnDisConnect事件:
Timer1.Enable := True;
直至连上后再断开,改回NonBlocking方式
这么做有点牵强,如果一连接上,Server就要主动向Client发送数据呢?你的意思是说如果两端都用Blocking方式就没有问题了?
> WSAENOBUFS
>
> (10055)
>
> No buffer space available.
>
> An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.你在哪里找到指定错误号的解释的?我怎么在Help里找不到?
然后键入 error codes