因为 我的 客户端 要 实时的 与 服务器端 进行数据传输所以使用Timer写了个 客户端自动连接服务器的 方法但是当客户端在使用(ClientSocket.Open)到第3900-4000次之后 就会报'Windows Socket error:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。(10055),On API 'Connect''.请高手帮忙解决一下啊!
调试欢乐多
Client := TClientsocket.Create...
Client...
Client.Open...
忘了写Client.Free然后运行一段时间,系统资源不够,就出现这错误了。
ErrorCode := 0;
Socket.Close;//这里吧socket关闭释放句柄资源
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掉。
请高手帮帮忙!
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;
多谢各位的帮忙附上解决了的代码
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;