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

windows socket error 10022 on API WSACANCELASYNCREQUEST,该怎么处理

2013-04-02 
windows socket error 10022 on API WSACANCELASYNCREQUEST以下是TIME控件里的代码..SocketClient的数量是

windows socket error 10022 on API WSACANCELASYNCREQUEST
以下是TIME控件里的代码..SocketClient的数量是根据配置文件中的数据动态创建的.创建完成后会与服务器进行连接.
以下代码均是在服务器没有运行的情况下测试....

void __fastcall TfrmShow::tmrSendTimer(TObject *Sender)
{
    tmrSend->Enabled = false;
    for(int i = 0;i< n_Btnnum; i++)
    {
        SocketClient[i]->Host = Buttons[i]->Hint;
        SocketClient[i]->Port = m_Port;
        int nFlag;
        if(SocketClient[i]->Active == false)
            SocketClient[i]->Active = true;
        nFlag = SocketClient[i]->Socket->SendText("1");  //随便发送消息.服务端收到即可响应
        if(nFlag == 0)
        {
            SocketClient[i]->Active = false;
            SocketClient[i]->Socket->Close();  //这句的问题.如果改成SocketClient[i]->Close()就不会出错.但是会导致句柄数无限上升直至用尽.
            Image[i]->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "\\Image\\close.png");  
        }
    }    
    tmrSend->Enabled = true;   
}


以下是onerror中的代码.
void __fastcall TfrmShow::OnSocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{

    ErrorCode = 0;
}


这样运行一段时间观察了下:
windows socket error:提供了一个无效的参数 10022 on API WSACANCELASYNCREQUEST

不明白无效参数是指在哪?求指点..
[解决办法]
应该在 SocketClient[i]->Active == false 的时候更换host和port
[解决办法]
引用:
引用:Send和Recv之前,检查Active是否为true了么?服务器没起来,客户端连不上,你调用Send当然会失败。……

我代码sendtext之前的那步就确定Active状态了..

另外.send失败并不是我关注的.我已经知道注定失败了..而我所需要知道的是哪一步参数错误.请看完全贴.谢谢.


唉,VCL封装属性害了人啊,SocketClient[i]->Active = true;这句代码执行完后,并不一定保证SocketClient[i]->Active == true;再看一下C++Builder的property,结合反汇编代码会让你理解更深刻。

至少应该这么写:
if(SocketClient[i]->Active == false)
    SocketClient[i]->Active = true;
if(SocketClient[i]->Active == true)
    nFlag = SocketClient[i]->Socket->SendText("1");  //随便发送消息.服务端收到即可响应

热点排行