首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

socket句柄用尽 不能施行套接字上的操作

2013-04-02 
socket句柄用尽 不能执行套接字上的操作.程序用临时创建了几个clientsocket.然后定时向服务端发送数据void

socket句柄用尽 不能执行套接字上的操作.
程序用临时创建了几个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的。

热点排行