引自《网络编程》第一版
s e l e c t函数,我们判断套接字上是否存在数据,或者能否向一个套接字写入数据。之所以要设计这个函数,唯一的目的便是防止应用程序在套接字处于锁定模式中时,在一次I / O绑定调用(如s e n d或r e c v)过程中,被迫进入“锁定”状态--------------
???SEND 和RECV 怎么样的情况下才会被迫进入锁定?(锁定模式)
那SELECT 是放在SEND和RECV前呢还是放在它们之后
还有SELECT的三个返回值-1错 0 和 1 各有什么用???
不明白怎么把SELECT和SEND 、RECV 一起用。

解决方案 »

  1.   

    缺省的套接字发送和接收都是阻塞的(你那本书翻译得真差,直接将lock翻译成了锁定实际上一般都称为阻塞)三个值的作用请参看有关的书用法请参看有关的例子.
      

  2.   

    sevencat你的意思也就是说
    如果我的网络有问题不能SEND数据出去不过SEND还在LOCK状态还在试
    这时我用SELECT去调这个套接字就可以有结果然后或关或再等数据发出是吗?
      

  3.   

    那SELECT是不是就是一个套接字的状态查询再用返回值去做处理?
      

  4.   

    select 模型其实就是调用的select函数。也是阻塞的。但可以设置超时时间
      

  5.   

    例如:select模型就是判斷BUF裏面是否有東西了。如果有,就recv。
      

  6.   

    也就是说如果数据量太大,可能要很多次RECV才能收完?是这样吗?那是不是要自己判断对方是否已经发完数据?
      

  7.   

    不用,select的参数中不是有一个时间设置吗?在指定的时间内会返回一个值的。判断返回值即可知道对方的状况,比如,对方是不是发了数据?等等。不管对方是否发了数据,或者对方是否一次发完,这些都不重要,重要的是select会在一个指定的时间内返回一个值,说明想接收或想发送的套接字是不是有这个资格!这就避免了锁死的情况。比如:
    SOCKET s;
    fd_set fdread;
    FD_ZERO(&fdread);
    FD_SET(s,&fdread);
    select(0,&fdread,NULL);
    ///////////////上面一句就是判断处于fdread中的套接字是否拥有接收数据的资格,这样一来,只有select返回正确值(非SOCKET_ERROR),在select后面的语句才具得接收数据的功能(这样保证不会锁死)
      

  8.   

    通过select函数可确定一个或多个套接字的状态,判断套接字上是否存在数据,或者能否向中一个套接字写入数据。
      

  9.   

    我的最后一个问题,如果SELECT 返回SOCKET_ERROR是不是等于需要放弃这个SOCKET?对于SERVER端上的RECV SOCKET 我如果关闭这个返回ERROR的SOCKET,不就等于关闭了SOCKET?
    是不是建一个LISTEN的SOCKET,一个RECV,再建一个SEND的比较好?
      

  10.   

    不就等于关闭了SERVER,打错了
      

  11.   

    还是不明白怎么把SELECT和SEND 、RECV 一起用
    谁能帮我讲讲
    如果在一个堵塞的套接字send()或者recv()之前加一个select(),设置超时,是不是就相当于非堵塞了
      

  12.   

    楼上说的对
    但是一般用IOCtrl设置socket为非阻塞模式
      

  13.   

    select 出错后,检查错误码,看看错误码指示的出错情况,如果必须关闭的,你不关也白搭;如果没有必要,那你就省的烦了,节约时间第一,呵呵。关于何时关闭是合适的,建议你详细看看错误码定义。
    #define IsDrop(iError)  (    iError==WSAENETRESET     \
                              || iError==WSAECONNABORTED  \
                              || iError==WSAECONNRESET    \                  || iError==WSAEINVAL )
    以上定义的基本上都要关闭