我用winsock的函数直接写的程序,可是recv是阻赛的,如果没有数据来就是一直等在这里,整个线程都停住了,请问怎么处理才好呢?因为是nt的service,没界面,而且是多线程的。所以不好用csocket,
select也用了,可是就是解决不了
各位高手帮帮我吧。急死了

解决方案 »

  1.   

    int rval=recv(m_socket,buffer,1024,0);
    if(rval<0) return FALSE;
    就是在这里停住了
      

  2.   

    int rval=recv(m_socket,buffer,1024,0);
    if(rval<0) return FALSE;
    就是在这里停住了
      

  3.   

    除了你前面的有没有设置为非阻塞纺事?
    用CAsyncSocket 类吧
      

  4.   

    Serveid设置的是非阻赛的啊,winsock默认就是非阻塞,accept都是非阻赛的
    但是就是在这里堵死了我试试看CAsyncSocket
      

  5.   

    up
    线程里面用
    CSocket m_socket;
    m_socket.Attach(*Socket);
    就出错
    分还没出去
      

  6.   

    用Socket的事件模式,参考函数:WSACreateEvent,WSAAsyncSelect。
    参考书:《Windows网络编程技术》
      

  7.   

    正确调用select,是不可能阻塞的。
      

  8.   

    WSACreateEvent,WSAAsyncSelect。
    我没窗体怎么做啊
      

  9.   

    ioctlsocket函数的FIONBIO 参数可设置阻塞/非阻塞。
    设置成非阻塞后,用select函数检查socket event,如果想立即返回,timeout参数设置成{0,0}不过我个人认为多线程的程序还是用阻塞的方式好。
      

  10.   

    unsigned long ul=1;
    ioctlsocket(*Socket,FIONBIO,(unsigned long *)&ul);
    SOCKET m_socket=*Socket;
    fd_set Socket_Read;
    FD_ZERO(&Socket_Read);
    FD_SET(m_socket,&Socket_Read);
    while(select(m_socket+1, &Socket_Read,NULL,NULL,0))到这还是阻赛~~
      

  11.   

    up
    我想把分送出去啊,各位帮忙啊,上面的代码哪里有错呢?
    *Socket是线程函数传进来的参数
      

  12.   

    使用事件机制的话CPU占用率会很高,如果没有窗口句柄的话,我建议采用完成端口的方式,具体可以参考侯捷翻译的《Win32多线程程序设计》一书,或是和我联系,我用这个方法已经成功解决了和你相类似的问题,而且效率很高.
      

  13.   

    int nTimeOut = 100;//0.1 second
    setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,&nTimeOut);
      

  14.   

    timeval timeout={2,2};
    天哪,这是什么结构
      

  15.   

    timeval timeout={2,2}; 等于struct timeval timeout;
    timeout.tv_sec = 2;  // 2 second
    timeout.tv_usec= 2;  // 0.000002 second
      

  16.   

    起一个线程接收数据,然后设置一个计时器。时间到了后线程没有返回就算超时,把那个线程杀掉。over.
      

  17.   

    谢谢各位,不好意思,分数有限,那位还需要,告诉我怎么在给你们加 :)
    已解决,用struct timeval的
      

  18.   

    EaStar1110(东辰) 
    怎么和你联系呢