我设置了socket的发送超时和接收超时代码如下:
  
struct timeval timeo;
socklen_t len = sizeof(timeo);
timeo.tv_sec = 20;
if (::setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeo,len)!=0)
{
Close();
return FALSE;
} if (::setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeo,len)!=0)
{
Close();
return FALSE;
}
 问题1:这段代码写在socket连接之前和之后应该没什么区别吧?
 问题2:recv的时候经常出现错误,错误代码用WSAGetLastError()获取了一下值,是10060 也就是超时,怎么会出现这种状况,有时候数据接受了一部分之后就超时了,有时候根本就没接收到数据。

解决方案 »

  1.   

    还有在recv的flag参数设置为MSG_WAITALL,症状会减轻 ,但是还是会有!帮帮忙~
      

  2.   

    网络状况很糟的时候.recv 很容易超时。阻塞recv就没问题。 开个线程阻塞recv 毫无问题。
      

  3.   

    对于recv应该是没有区别的
    这是本机测试吗?
    还是不同机器测试,网络不好
      

  4.   

    就是本机测试,我做的一个蜘蛛程序,下载html代码 ,经常超时,不知道为什么
      

  5.   

    问题1:设置套接字选项必须在连接或者绑定之前
    问题2:默认情况下,套接字没有设置超时机制,因而recv不会返回超时错误,你自己设置超时值后,recv就会根据你设置的超时值返回timeout。
      

  6.   

    可能不是这个问题,客户端是否断开,若断开怎么还能recv呢?