我写的网络通讯程序
服务端用的是 select + 单线程 + 阻塞模式一开始的时候服务端和客户端都没设超时,结果有时候因为客户端异常,会出现服务端卡死在recv和send的现象后来我在服务端和客户端都加了超时设置那么我想请教下,客户端的SOCKET要不要设置超时?因为服务端用单线程模式的话,我觉得有可能出现如下情况:多个客户端同时有请求,服务端会一个一个处理客户端请求,如果客户端设了超时,那么最后一个客户端,很可能等不到服务器的响应就发生recv超时了如果不设的话,就不会出现这种情况有没有高人指点下,我的想法是否正确

解决方案 »

  1.   

            //设置超时
    int timeout   =   2000; 
    Rtn  =   setsockopt(m_socket,   SOL_SOCKET,   SO_RCVTIMEO,   (char*)&timeout,   sizeof(timeout));  
      

  2.   

    int select(nfds, readfds, writefds, exceptfds, timeout)select的超时不能解决?
      

  3.   

    经过测试,select +多线程,效率还是可以的,完全可以实现类似异步SOCKET
      

  4.   

    recv前先select一下,select里面有超时的设置,如果select没有超时,你就recv.
      

  5.   

    客户端的SOCKET应该也要设置超时吧
      

  6.   

    异常断开的话可以使用心跳包来检查,在规定的时间间隔内没有收到回应就确认连接断开了,这个时候就要关闭SOCKET了