Socket 缓冲区空间不足

xnekin 2009-11-18 03:16:46
因为 我的 客户端 要 实时的 与 服务器端 进行数据传输

所以使用Timer写了个 客户端自动连接服务器的 方法

但是当客户端在使用(ClientSocket.Open)到第3900-4000次之后 就会报

'Windows Socket error:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。(10055),On API 'Connect''.

请高手帮忙解决一下啊!
...全文
444 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangjingnian 2011-08-04
  • 打赏
  • 举报
回复
但为什么我设置测试后会返回-1 失败啊
xnekin 2009-11-20
  • 打赏
  • 举报
回复
问题解决了
多谢各位的帮忙

附上解决了的代码
procedure TForm1.FormCreate(Sender: TObject);
begin
T_Send.Interval:=1000;
T_Send.Enabled:=True;
ConnUse:=True; //这个是全局的
end;

procedure TForm1.T_CliTimer(Sender: TObject);
begin
if ConnUse then //判断客户端Disconnect方法是否执行完
begin
if not ClientSocket.Active then
begin
ClientSocket.Open;
end
else
begin
T_Send.Enabled:=False;
end;
ConnUse:=False; //每次执行都将初始化Disconnect方法执行状体
end;
end;

procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
T_Send.Enabled:=True;
ErrorCode:=0;
Socket.Close;
end;

procedure TForm1.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ConnUse:=True;
end;

procedure TForm1.ClientLookup(Sender: TObject;
Socket: TCustomWinSocket);
var
Bo_Dontlinger : BOOL;
begin
Bo_Dontlinger := True;
SetSockOpt(Socket.SocketHandle, SOL_SOCKET, SO_DONTLINGER, @Bo_Dontlinger, sizeof(BOOL));
end;
shuihan20e 2009-11-19
  • 打赏
  • 举报
回复
楼上方法正确
noeyes277 2009-11-18
  • 打赏
  • 举报
回复
在 ClientSocket 的OnLookup事件里,调整Socket的参数 (uses WinSock):
procedure TForm1.ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
var
Bo_Dontlinger : BOOL;
begin
Bo_Dontlinger := True;
SetSockOpt(Socket.SocketHandle, SOL_SOCKET, SO_DONTLINGER, @Bo_Dontlinger, sizeof(BOOL));
end;
xnekin 2009-11-18
  • 打赏
  • 举报
回复
procedure TForm1.FormCreate(Sender: TObject);
begin
T_Cli.Interval:=1000;
T_Send.Enabled:=True;
end;

procedure TForm1.T_CliTimer(Sender: TObject);
begin
if not ClientSocket.Active then
begin
ClientSocket.Open;
end
else
begin
T_Send.Enabled:=False;
end;
end;

procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
T_Send.Enabled:=True;
ErrorCode:=0;
Socket.Close;
end;

我的代码是这样的, 请问有什么问题吗?
顺便问下, Socket缓冲区怎么清空!
因为 我客户端 连上服务器之后就会跟 服务器发送消息,
所以 我的客户端不能Free掉。
请高手帮帮忙!

beiguofengguang 2009-11-18
  • 打赏
  • 举报
回复
如果是连接失败,然后重复尝试连接的话,可以在onerror事件里加入以下代码:
ErrorCode := 0;
Socket.Close;//这里吧socket关闭释放句柄资源
ERR0RC0DE 2009-11-18
  • 打赏
  • 举报
回复
估计就是在Timer事件写了:
Client := TClientsocket.Create...
Client...
Client.Open

...
忘了写Client.Free

然后运行一段时间,系统资源不够,就出现这错误了。
李_军 2009-11-18
  • 打赏
  • 举报
回复
你刚open没关闭和释放吧
haitao 2009-11-18
  • 打赏
  • 举报
回复
客户端连了不再释放的?
什么配置的机器?每个连接是要占一定内存开销的
xnekin 2009-11-18
  • 打赏
  • 举报
回复
自己先顶了

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧