本人在网上看了好多有关设置socket操作为非阻塞相关的问与答,设置socket为非阻塞的有select、ioctlsocket等,我试了好多也没有成功。希望高手指点并给出实例。也有些人说CSocket不用在多线程中,可以也没有说明理由。也希望高手们多共享的更全面一些。多谢!

解决方案 »

  1.   

    WSAAsyncSelect,一般和窗口相关时使用。
      

  2.   

    给你一个例子吧,用Socket连接服务器时的一个利用非阻塞的例子:bool CClientSocket::ConnSvr(char *szIp, int nPort)
    {
    strcpy(m_szIp, szIp);
    m_nPort = nPort; struct in_addr ip_addr;
    unsigned long lIp = inet_addr(szIp);
    ip_addr.S_un.S_addr = lIp;

    struct sockaddr_in destaddr;
    memset((void *)&destaddr,0,sizeof(destaddr)); 
    destaddr.sin_family = AF_INET;
    destaddr.sin_port = htons(nPort);
    destaddr.sin_addr = ip_addr;

    unsigned long ul = 1;
    int ret = ioctlsocket(m_sck, FIONBIO, &ul);  //设置为非阻塞模式
    if(ret == SOCKET_ERROR)
    return false; int error = -1, len;
    len = sizeof(int);
    timeval tm;
    fd_set set;
    bool bret = false;
    if(connect(m_sck,(struct sockaddr*)&destaddr,sizeof(destaddr)) == -1)
    {
    tm.tv_sec = 8;
    tm.tv_usec = 0;
    FD_ZERO(&set);
    FD_SET(m_sck, &set);
    if(select(m_sck + 1, NULL, &set, NULL, &tm) > 0)
    bret = true;
    else
    bret = false;
    }
    else
    bret = true; if(!bret)
    return false ;//表示连接不上服务器 unsigned long ul1= 0 ;
    ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul1);//再设置为阻塞模式
    if(ret == SOCKET_ERROR)
    return false;//错误
    m_bConnected = true;
    return true;
    }
      

  3.   

    请大侠帮忙用CSocket实现一个连接服务端并向服务端发送数据/接收数据,关键是在调用Receive时,如果3秒内没有数据到达,就进行下面的操作。
      

  4.   

    int TimeOut=3000; //设置发送超时3秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
    return 0;
    }
    TimeOut=3000;//设置接收超时3秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
    return 0;
    }