疑问在代码后面已经注释出来了,这之前的创建socket是没问题的//设置为非阻塞模式 while ( TRUE)
{
FD_ZERO(&fdread);
FD_SET(comm_socket,&fdread); ret = select(0,&fdread, NULL,NULL,&tmOut);          //--为什么这里总是返回 0了? DWORD r  = WSAGetLastError(); if ( ret == SOCKET_ERROR)
{
return FALSE ;
}
else
{
int rct ;
rct = connect(comm_socket, (sockaddr*)&comm_addr, len);   //--为什么这里也总是返回0了 DWORD rr  = WSAGetLastError(); if ( rct == SOCKET_ERROR)
{
return FALSE ;
}
}
}

解决方案 »

  1.   

    The select function returns the total number of socket handles that are ready and contained in the FD_SET structures, zero if the time limit expired, or SOCKET_ERROR if an error occurred. If the return value is SOCKET_ERROR, WSAGetLastError can be used to retrieve a specific error code.检查一下你的tmOut
      

  2.   


    timeval tmOut ;
    tmOut.tv_sec  = 2;
    tmOut.tv_usec = 0;
      

  3.   

    ret = select(0,&fdread, NULL,NULL,&tmOut);          //--为什么这里总是返回 0了?
    这是因为接收缓冲区里没有任何东西
      

  4.   

    混乱啊,老兄
    readfds
    ■ 有数据可以读入。
    ■ 连接已经关闭、重设或中止。
    ■ 假如已调用了listen,而且一个连接正在建立,那么accept函数调用会成功。writefds
    ■ 有数据可以发出。
    ■ 如果已完成了对一个非锁定连接调用的处理,连接就会成功。connect是写在主线程的,在select等待connect的结果,而且等结果要用writefds天!!
    你把connect写这里了,还要Select做啥?
      

  5.   

    Windows网络编程第二版 中文版 第8章
    CSDN有下
      

  6.   

    第8章Winsock I/O方法
    http://download.csdn.net/source/571827
      

  7.   

    不忙的时候自己写1个纯阻塞模式的收发文件程序,
    在线程里发消息给自己,(也就是自己模仿select的功能),再看书就容易多啦
      

  8.   

    1. 还没有建好连接,select有意义吗? 正确的顺序应该是先connect之后再select.在没有connect之前调用select, 一定会返回0, 这时是超时返回. 
    2. 如果你在第一次调用到connect时,返回0, 说明不是非阻塞状态,你之前的非阻塞设置有问题. 非阻塞的connect一定会返回错误,这时要判断错误值是不是WSAEWOULDBLOCK另外,非阻塞的connect是否成功要用select的writefs来判断.
      

  9.   


    你能帮我修改一下这段我写的很差劲的代码吗 谢谢你
    //设置为非阻塞模式    while ( TRUE)
        {
            FD_ZERO(&fdread);
            FD_SET(comm_socket,&fdread);        ret = select(0,&fdread, NULL,NULL,&tmOut);          //--为什么这里总是返回 0了?        DWORD r  = WSAGetLastError();        if ( ret == SOCKET_ERROR)
            {
                return FALSE ;
            }
            else
            {
                int rct ;
                rct = connect(comm_socket, (sockaddr*)&comm_addr, len);   //--为什么这里也总是返回0了            DWORD rr  = WSAGetLastError();            if ( rct == SOCKET_ERROR)
                {
                    return FALSE ;
                }
            }
        }
      

  10.   

    unsigned   long   ul   =   1;   
      int   ret   =   ioctlsocket(SockFD,   FIONBIO,   (unsigned   long*)&ul);   
      if(ret==SOCKET_ERROR)     
              return   FALSE;