socket中怎么设置超时,是用setsockopt(sockRaw, OL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout))吗?timeout是超时时间
我用这个怎么产生不了超时错误啊?那位dx能讲讲?

解决方案 »

  1.   

    http://study.99net.net/study/program/vc/1085476685.html
      

  2.   

    WSADATA wsd;
    SOCKET cClient;
    int ret;
    struct sockaddr_in server;
    hostent *host=NULL;if(WSAStartup(MAKEWORD(2,0),&wsd))
    {
    return 0;
    }
    cClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(cClient==INVALID_SOCKET)
    {
    return 0;
    }
    //set Recv and Send time out
    int TimeOut=6000; //设置发送超时6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
    {
    return 0;
    }
    TimeOut=6000;//设置接收超时6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
    {
    return 0;
    }
    //设置非阻塞方式连接
    unsigned long ul = 1;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
    if(ret==SOCKET_ERROR)return 0;//连接
    server.sin_family = AF_INET;
    server.sin_port = htons(25);
    server.sin_addr.s_addr = inet_addr((LPCSTR)pSmtp);
    if(server.sin_addr.s_addr == INADDR_NONE)
    {
    return 0;
    }connect(cClient,(const struct sockaddr *)&server,sizeof(server));//select 模型,即设置超时
    struct timeval timeout ;
    fd_set r;FD_ZERO(&r);
    FD_SET(cClient, &r);
    timeout.tv_sec = 15; //连接超时15秒
    timeout.tv_usec = 0;
    ret = select(0, 0, &r, 0, &timeout);
    if ( ret <= 0 )
    {
    ::closesocket(cClient);
    return 0;
    }
    //一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
    unsigned long ul1= 0 ;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
    if(ret==SOCKET_ERROR)
    {
    ::closesocket (cClient);
    return 0;
    }
    //faq上也有的
      

  3.   

    int TimeOut = 5000;
    if(setsockopt( hSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&TimeOut, sizeof(int)))
    {
        AfxMessageBox( _T("Set Timeout Error!"));
    }
    这个没问题啊.
      

  4.   

    SO_SNDTIMEO
    选项值类型获取/设置Wi n s o c k版本说明
    整数两者均可1 + 获取或设置套接字上的数据发送超时时间(以毫秒为单位)
    S O _ S N D T I M E O选项用于在一个锁定套接字上调用Wi n s o c k发送函数时,设定一个“超时”
    值。这是一个以毫秒为单位的整数值,设定发送函数最多执行多久。假如需要使用
    S O _ S N D T I M E O选项,并用W S A S o c k e t函数创建套接字,那么必须将W S A _ F L A G _ O V E R L A P P E D
    设为W S A S o c k e t的d w F l a g s参数的一部分。以后对任何Wi n s o c k发送函数的调用(s e n d、s e n d t o、
    W S A S e n d、W S A S e n d To等等)都只会锁定指定数量的时间。如发送操作在那段时间内不能完
    成,调用便会失败,并返回错误1 0 0 6 0(W S A E T I M E D O U T)。
      

  5.   

    /deTime INFINITE为无限等待
    VOID CMyUDP::SetTimeOut(DWORD deTime)
    {
    DWORD optval;
    if(deTime)
    {
    optval=0;
    ioctlsocket(m_sock,FIONBIO,(DWORD*)&optval);

    if(INFINITE==deTime)
    optval=0;
    else
    optval=deTime; setsockopt(m_sock,SOL_SOCKET, SO_RCVTIMEO, (char *)&optval, sizeof(int));
    DWORD error=GetLastError();

    }
    else
    {
    optval=1;
    ioctlsocket(m_sock,FIONBIO,(DWORD*)&optval);
    }
    }
      

  6.   

    http://blog.csdn.net/antghazi/archive/2001/12/17/5407.aspx