rt. 立刻给分!

解决方案 »

  1.   

    我发现我真该去买本书了,只看MSDN真头疼~~~~~~~
      

  2.   

    楼主在学习非阻塞的socket模型以前最好是对socket通信的基本知识有所了解然后就是需要看一下非阻塞的各种模型了:比较简单的,
    select模型
    WSAAsyncSelect模型
    WSAEventSelect模型
    比较复杂的,
    重叠模型
    完成端口模型这些模型多多少少都要比阻塞模型复杂,但是也能带来更好的性能具体楼主最好是买本书了,里面的东西很多的^_^
      

  3.   

    我了解模型,但不知道代码怎么写(我很晕,是吧?其实阻塞的代码我都做好了。  ^_^)哪位大侠能指点一下救急啊~~~~~~
    (不是不想买书,现在实在没机会 & 条件,以后肯定要买的)还有啊,socket是POSIX兼容标准的,不要用WSA*系列。
      

  4.   

    阻塞是一种机制而已,不一定要使用WSA系列函数。
    另外指出小猪的错误:select模型跟阻塞非阻塞无关。
    非阻塞的意义在于调用send,recv的时候会立即返回,而不去管数据是不是处理完了。
      

  5.   

    哦,呵呵,不好意思*^_^*我没用过select模型,一直以为是非阻塞的呢我倒是用非阻塞模型做过东西,但是把代码都发给你你会晕的,因为里面还有很多别的东西呵呵其实《windows网络编程》是一本很好的书,如果楼主是专门从事网络编程的话,这本书很值得珍藏的^_^
      

  6.   

    设置socket为非阻塞!然后connet!还原socket再select!再connect
      

  7.   


    int CTcp::recv(int sd, char *buf, int len, int timeout)
    {
      int len1, len_recv;
      time_t t2, t1;  len_recv =0;
      time(&t1);
      t2 =t1;  int err =0;
      int counter=0;
      while(len_recv <len)
      {
        if(t2 -t1 >timeout)
    {
    WSASetLastError(err);
    return len_recv;
    }
        if(status(sd, "r", timeout-(t2-t1)) <0)
        {
    err =WSAGetLastError();
    //WriteStat("tcp_status err=%d", WSAGetLastError());
    WSASetLastError(err);
    return len_recv;
    } if((len1 =::recv(sd, &buf[len_recv], len-len_recv, 0)) <=0)
         {
    err =WSAGetLastError();
    //WriteStat("recv err=%d, len1=%d", err, len1);
           if(timeout ==0) break;
           if(len1 ==SOCKET_ERROR && err ==WSAEWOULDBLOCK)
           {
             time(&t2); if(counter++>100)
      {
      Sleep(100);
      counter=0;
      } continue;
           }
       WSASetLastError(err);
           return len_recv;
        }
        len_recv +=len1;
        time(&t2);
      }
      WSASetLastError(err);
      return len_recv;
    }
      

  8.   

    ioctlsocket(sd, FIONBIO, (unsigned long *)&l)