select(0,&fdread,NULL,NULL);
if(FC_ISSET(socket,&fdread)
{
   recv(..);
}是这样用吗?
这样recv就不会阻塞了吗?我试了,好像不行呀.

解决方案 »

  1.   

    struct timeval timeout;
    fd_set fs;
    FD_ZERO(&fs);
    FD_SET(m_hSock,&fs);
    timeout.tv_sec = 40; //second
    timeout.tv_usec = 0; //million second
    int ret=0;
    ret = select(0,&fs,0,0,&timeout);
    if( ret <= 0 ) 
    {
        printf("error");
        return;
    }
      

  2.   

    这些东东我都写了
    为什么select返回值是-1?
    我用csocket不能这么用select吗?
      

  3.   

    timeout -> 0,0
    我是这样写的
      

  4.   

    recv阻塞和select没关系!有关系的是你的socket的属性.select只是事件通知.
      

  5.   

    select不是可以判断是否可以向一个套接字写入数据或者套接字是否可读吗?如果判定某套节子可以写,那么再调用recv不是就不会出现阻塞了吗?
    不然套接字可写是什么意思呀?
      

  6.   

    如果select不关用,那么bsd怎么能防止socket阻塞呢?它不是没有异步模型吗?
    还请各位指点指点
      

  7.   

    bsd 异步模型还是有的用ioctlsock设置,找到了,不好意思
    可是我觉得select还是没什么用啊,他能监测套接字可读,"可读"到底是什么意思呀?
      

  8.   

    recv(Sock,&c,1,0);
    一个一个字节读,看堵不
    也许你一次读多了
    可读只表示有数据,没说有多少阿
      

  9.   

    是不是每次recv的时候就把接收缓冲里的一些内容删掉(recv多少,就删多少),读到最后读完了,缓冲区就没有数据了,所以套接字就不可读了呢?
      

  10.   

    不是看你是同步还是异步了,如果是同步的话等到对等的一方回应在删除!
    如果是异步的话,一般recv()后直接删除socket缓冲区;