我在用socket编写一个聊天程序时,出现了一个问题。在客服及连接服务机的connect中出现了错误,我用FormatMessage查看了下是   (无法立即完成一个非阻挡性套接字的操作)请问哪位高手知道的,知道的帮帮我。

解决方案 »

  1.   

    你用的是非阻塞套接字,解决办法:
    1 改用阻塞套接字;
    2 用非阻塞套接字,用select或wsaeventselect等通过检测其是否可写,如果可写,连接完成。
      

  2.   

    我在里面使用WSAAsyncSelect来进行异步处理的,下面是服务器初始化的一些程序,就在connect后我用formatmessage查看了WSAGetLastError就是上面说的错误。
    void CChatDlg::ClientInit()
    {
    CString strip;
    GetDlgItemText(IDC_EDIT_CIP,strip);
    CString strport;
    GetDlgItemText(IDC_EDIT_CPORT,strport);
    int iport;
    iport=atoi(strport); SOCKADDR_IN saddr;
    saddr.sin_addr.S_un.S_addr=inet_addr(strip);
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(iport); m_ClientSock=socket(AF_INET,SOCK_STREAM,0);
    if(INVALID_SOCKET==m_ClientSock)
    {
    MessageBox("client sock establish error!");
    return;
    }
    if(0!=WSAAsyncSelect(m_ClientSock,m_hWnd,WM_CLIENT_MESSAGE,
    FD_CONNECT|FD_WRITE|FD_READ|FD_CLOSE))
    {
    MessageBox("client WSAAsyncSelect error!");
    return;
    }
    if(SOCKET_ERROR==connect(m_ClientSock,(sockaddr*)&saddr,sizeof(saddr)))
    {
    //MessageBox("client connect error!");
    LPVOID lpMsgBuf;
    FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    WSAGetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
    );
    ::MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    LocalFree( lpMsgBuf );

    return;
    }
    m_list.AddString("Connecting...");
    }
    处理WM_CLIENT_MESSAGE程序
    int CChatDlg::OnClientMessage(HWND hwnd,WPARAM wParam,LPARAM lParam)
    {
    if(WSAGETSELECTERROR(lParam))
    {
    closesocket(m_ClientSock);
    CString strmsg("Server no response");
    m_list.AddString(strmsg);
    }
    switch(WSAGETSELECTEVENT(lParam))
    {
    case FD_CONNECT:
    {
    CString strmsg("Successfully connected.");
    m_list.AddString(strmsg);
    }
    break;
    case FD_READ:
    {
    char buffer[1024];
    int recvlen;
    recvlen=recv(m_ClientSock,buffer,1024,0);
    if(SOCKET_ERROR==recvlen)
    {
    MessageBox("client recv error");
    }
    else
    {
    m_list.AddString(buffer);
    }
    }
    break;
    case FD_WRITE:
    break;
    case FD_CLOSE:
    {
    closesocket(m_ClientSock);
    CString strmsg("Server close session.");
    m_list.AddString(strmsg);
    }
    break;
    }
    return 0;
    }请高手指点。
      

  3.   

    还是没写出  WSAGetLastError()=?sockSend.AsyncSelect(0);//由于CSocket实际是异步,将它变为同步(阻塞)方式。
      

  4.   

    楼上的,我的WSAGetLastError在connect下的FormatMessage里面,就是这里的connect出了错误。另外,我用的是socket API编程,没用CSocket