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

快被折磨崩溃.关于SOCKET

2013-04-09 
快被折磨崩溃.关于SOCKET.求助本帖最后由 HelpToMe 于 2013-03-26 12:10:30 编辑先说明下情况.最近几天一

快被折磨崩溃.关于SOCKET.求助
本帖最后由 HelpToMe 于 2013-03-26 12:10:30 编辑 先说明下情况.最近几天一直被socket句柄数折磨着.谷歌了网上的一些方法.控制住句柄后又会产生连带的问题..一直未曾解决..
程序的设计流程是这样的:
1.根据配置文件创建一定数目的clientsocket
2.用time控件定时向server发送信息.
3.读取server返回的信息.

目前这3步流程全部已经实现.
困扰在socket的close上.因为不能排除服务器故障.我是在自己电脑上运行的程序.也就是假设所有服务器都没有开启的状态下在运行客户端程序.
之前采用的方法是在socket的onerror事件里关闭socket.代码如下:

void __fastcall TfrmShow::OnSocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
    ErrorCode = 0;
    Socket->Close();     
}

但是句柄数还是一直上升.最后导致缓存不足.不能执行套接字.
现在采用的办法是直接发送后判断是否发送成功
代码如下
void __fastcall TfrmShow::tmrSendTimer(TObject *Sender)
{
    tmrSend->Enabled = false;
    for(int i = 0;i< n_Btnnum; i++)
    {
        AnsiString sStr = Buttons[i]->Hint; //创建clientsocket的同时将配置文件的目标IP写入同样排序的按钮hint中,后期从这里读取目标IP地址.
        SocketClient[i]->Port = m_Port;//统一的端口.
        int nFlag;
        if(SocketClient[i]->Active == false) //如果SocketClient关闭的.则赋值并开启.
        {
            SocketClient[i]->Host = sStr;
            SocketClient[i]->Port = m_Port;
            SocketClient[i]->Active = true;
        }
        nFlag = SocketClient[i]->Socket->SendText("1");  //随便发送消息.服务端收到即可响应
        if(nFlag == 0) //如果发送失败
        {
            SocketClient[i]->Socket->Close();
            Image[i]->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "\\Image\\close.png");  
            
        }    
    }    
    tmrSend->Enabled = true;   
}


在运行一段时间后就会出现句柄数是控制住了.但是又产生了新的问题:
windows socket error:提供了一个无效的参数 10022 on API WSACANCELASYNCREQUEST

我也尝试用closesocket,setsockopt等函数强行关闭socket但是都不能达到效果...

各种无果...求助~..本来要给200分.但是发贴的时候提示给分必须在20-100之间...后面再追加分吧..很急...求解决办法...
[解决办法]
建议你在客户端直接用WinSock里面的API,比如socket、connect、send、recv这些函数,然后开一个单独的线程进行通信,这样结构比较清晰,不容易出错,socket的API还是比较简单的,用起来并不比那些封装类麻烦多少
[解决办法]
如果你执行到:SocketClient[i]->Active = true;
然后在同一循环里立即执行发送数据:
        nFlag = SocketClient[i]->Socket->SendText("1"); 

失败的可能性非常高。这个时候TCP连接很可能还没有建立完呢。


你可以改变一下策略。不要用长连接,改用短连接,在OnTimer里只打开socket

在OnConnect事件里发送你的数据,数据发送完关闭socket
[解决办法]
在你另一个帖子回了windows socket error:提供了一个无效的参数 10022 on API WSACANCELASYNCREQUEST,是网络不好,没数据,造成的,把你网络调好吧 。

热点排行