socket句柄用尽 不能执行套接字上的操作.该如何解决
socket句柄用尽 不能执行套接字上的操作.
程序用临时创建了几个clientsocket.然后定时向服务端发送数据
在socket的ONERROR事件里如下写:
为何已经关闭了..在运行程序大概几个小时后依然会出现系统缓冲空间不足.不能执行套接字上的操作.
------解决方案--------------------
最好用完就关闭
------解决方案--------------------
打开windows任务管理器,看看你的程序句柄数是多少,如果socket句柄泄露导致无法创建新的socket,应该会看到句柄数很大。
“如果能正常通信的话.在serversocket那边的线程里在接受到信息后就关闭了该clientsocket了..
”
一对tcp连接,关闭时4次握手,server和client都需要调用close的。
程序用临时创建了几个clientsocket.然后定时向服务端发送数据
void __fastcall TfrmShow::tmrSendTimer(TObject *Sender)
{
tmrSend->Enabled = false;
for(int i = 0;i< n_Btnnum; i++)
{
AnsiString sStr = SocketClient[i]->Host;
SocketClient[i]->Port = m_Port;
if(SocketClient[i]->Active == false)
SocketClient[i]->Active = true;
SocketClient[i]->Socket->SendText("1"); //随便发送消息.服务端收到即可响应
}
tmrSend->Enabled = true;
}
在socket的ONERROR事件里如下写:
void __fastcall TfrmShow::OnSocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
in_addr inaddr;
inaddr = Socket->Addr.sin_addr;
AnsiString sAddr = inet_ntoa(inaddr);
//出现的均是通讯有问题的数据.
for(int i = 0;i< n_Btnnum; i++)
{
if(iledZsd[i]->Hint == sAddr)
{
Image[i]->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "\\Image\\close.png");
//同时关闭此socket.防止用尽句柄
SocketClient[i]->Close();
SocketClient[i]->Active = false;
}
}
ErrorCode = 0;
}
为何已经关闭了..在运行程序大概几个小时后依然会出现系统缓冲空间不足.不能执行套接字上的操作.
------解决方案--------------------
最好用完就关闭
------解决方案--------------------
打开windows任务管理器,看看你的程序句柄数是多少,如果socket句柄泄露导致无法创建新的socket,应该会看到句柄数很大。
“如果能正常通信的话.在serversocket那边的线程里在接受到信息后就关闭了该clientsocket了..
”
一对tcp连接,关闭时4次握手,server和client都需要调用close的。