精华内容
下载资源
问答
  • VC socket Connect 超时时间设置

    千次阅读 2013-01-18 10:11:47
    设置connect超时很简单,CSDN上也有人提到过使用select,但却没有一个令人满意与完整的答案。偶所讲的也正是select函数,此函数集成在winsock1.1中,简单点讲,"作用使那些想避免在套接字调用过程中被锁定的应用程序...

    设置connect超时很简单,CSDN上也有人提到过使用select,但却没有一个令人满意与完整的答案。偶所讲的也正是select函数,此函数集成在winsock1.1中,简单点讲,"作用使那些想避免在套接字调用过程中被锁定的应用程序,采取一种有序的方式,同时对多个套接字进行管理"(《Windows网络编程技术》原话)。使用方法与解释请见《Windows网络编程技术》。
      在使用此函数前,需先将socket设置为非阻塞模式,这样,在connect时,才会立马跳过,同时,通常也会产生一个WSAEWOULDBLOCK错误,这个错误没关系。再执行select则是真正的超时。

    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
    DWORD 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;
    }

    原文:http://www.cnblogs.com/nemolog/archive/2006/03/12/348431.html

    补充——关于Socket阻塞和非阻塞的区别:

    简单点说:

    阻塞就是干不完不准回来,   
    非组赛就是你先干,我现看看有其他事没有,完了告诉我一声

    我们拿最常用的send和recv两个函数来说吧...
    比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于非阻塞的socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说:"发送操作被阻塞了!!!你想办法处理吧..."
    对于recv函数,同样道理,该函数的内部工作机制其实是在等待TCP/IP协议栈的接收缓冲区通知它说:嗨,你的数据来了.对于阻塞模式的socket来说如果TCP/IP协议栈的接收缓冲区没有通知一个结果给它它就一直不返回:耗费着系统资源....对于非阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK---"现在没有数据,回头在来看看"

    展开全文
  • 设置connect超时时间

    千次阅读 2012-12-12 19:10:06
    socket编程中,当客户端connect()连接一个服务端时,如果网络或服务端繁忙,connect()函数会迟迟不会返回(阻塞模式下...3、如果出错,用select()系统调用对其进行超时检测,看在给定的时间内socket是否变得可写 int
    socket编程中,当客户端connect()连接一个服务端时,如果网络或服务端繁忙,connect()函数会迟迟不会返回(阻塞模式下)。这里有个方法,可以设置如果在给定的时间内还没有连接上,就不在连接。
    

    1、设置socket为非阻塞模式

    2、connect()连接

    3、如果出错,用select()系统调用对其进行超时检测,看在给定的时间内socket是否变得可写

    int fd = socket(PF_INET,SOCK_STREAM,0);
    ...
    int flags = fcntl(fd,F_GETFL,0);
    fcntl(fd,F_SETFL,flags | O_NONBLOCK);
    int n = connect(fd,(struct sockaddr*)&addr,sizeof addr);
    if(n < 0)
    { // EINPROGRESS表示connect正在尝试连接
    if(errno != EINPROGRESS && errno != EWOULDBLOCK)
    return 1;

    struct timeval tv;
    tv.tv_sec = 10;
    tv.tv_usec = 0;
    fd_set wset;
    FD_ZERO(&wset);
    FD_SET(fd,&wset);
    n = select(fd+1,NULL,&wset,NULL,&tv);
    if(n < 0)
    { // select出错
    perror("select()");
    close(fd);
    return 1;
    }
    else if (0 == n)
    { // 超时
    cerr<< "Timeout." << endl;
    close(fd);
    return 1;
    }
    else
    { // 连接成功
    cerr << "Connectd." <<endl;
    }
    }

    fcntl(fd,F_SETFL,flags & ~O_NONBLOCK); // 设为阻塞模式
    展开全文
  • Resolve long timeout when connection target is unavailableSometimes, the connect time-out can take too much time when the target is unavailable. To resolve this issue, we can use non-blocking ...

    Resolve long timeout when connection target is unavailable

    Sometimes, the connect time-out can take too much time when the target is unavailable. To resolve this issue, we can use non-blocking socket mode to select the timeout.

    bool connect(char *host,int port, int timeout)  
    {  
        TIMEVAL Timeout;  
        Timeout.tv_sec = timeout;  
        Timeout.tv_usec = 0;  
        struct sockaddr_in address;  /* the libc network address data structure */     
       
        sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
       
        address.sin_addr.s_addr = inet_addr(host); /* assign the address */  
        address.sin_port = htons(port);            /* translate int2port num */   
        address.sin_family = AF_INET;  
       
        //set the socket in non-blocking  
        unsigned long iMode = 1;  
        int iResult = ioctlsocket(sock, FIONBIO, &iMode);  
        if (iResult != NO_ERROR)  
        {     
            printf("ioctlsocket failed with error: %ld\n", iResult);  
        }  
              
        if(connect(sock,(struct sockaddr *)&address,sizeof(address))==false)  
        {     
            return false;  
        }     
       
        // restart the socket mode  
        iMode = 0;  
        iResult = ioctlsocket(sock, FIONBIO, &iMode);  
        if (iResult != NO_ERROR)  
        {     
            printf("ioctlsocket failed with error: %ld\n", iResult);  
        }  
       
        fd_set Write, Err;  
        FD_ZERO(&Write);  
        FD_ZERO(&Err);  
        FD_SET(sock, &Write);  
        FD_SET(sock, &Err);  
       
        // check if the socket is ready  
        select(0,NULL,&Write,&Err,&Timeout);              
        if(FD_ISSET(sock, &Write))   
        {     
            return true;  
        }  
       
        return false;  
    }  

    展开全文
  • 无论你用任何语言或者是网络库,你都可以设置网络操作的超时时间,特别是connect、read、write的超时时间。 你可以在代码中把超时时间设置任意大小值,但是connect方法会有一点特殊。 connect超时时间在任意的...


    无论你用任何语言或者是网络库,你都可以设置网络操作的超时时间,特别是connect、read、write的超时时间。

    你可以在代码中把超时时间设置任意大小值,但是connect方法会有一点特殊。
    connect的超时时间在任意的内核实现上都有一个可以设置的最大值,你的代码中设置的超时值并不能超过这个最大值(即使你设置的值超过这个最大值,其仍然会在最大超时时间后time out)。

    tcp建立连接的过程从客户端发送syn包开始。如果客户端没有收到这个syn包的回复,内核会重试多次发送syn包,每次重试的间隔都会逐渐增加,避免发送太多的syn包影响网络。
    所有的内核对syn包发送的重复次数都有一个上限值。在BSD衍生的内核中(包括Mac OS X),会在第一次发送syn包后的6秒重试第二次,在第二次尝试后的18秒尝试第三次,如果第3次还不能成功就认为connect超时(此时经过了75秒)。
    然而,在linux系统上,整个syn包发送的事件过程才差不多20几秒。linux系统比bsd类系统重发syn包的时间间隔要密。linux在20多秒内发送5个syn包(其中包括原始的syn包和后面的重发包),其依次在首包发送的3s,6s,12s,24s后发送。
    如果你的程序设置的connect超时时间比20s小,那么没有问题。但是如果你的设置值大于20s,那么你会发现内核会将该值截断为20s。

    改变这个系统上限值也比较容易,由于需要改变系统配置参数,你需要root权限。
    相关的命令是sysctl net.ipv4.tcp_syn_retries(针对于ipv4)。
    在设置该值时还是要比较保守的,因为每次syn包重试的间隔都会增大(比如BSD类的系统实现中间隔会以2到3倍增加),所有tcp_syn_retries的一个微小变化对connect超时时间的影响都非常大,不过扩大这个值也不会有什么坏处,因为你代码中设置的超时值都能够生效。但是如果代码中没有设置connect的超时值,那么connect就会阻塞很久,你发现对端机器down掉的间隔就更长。
    作者建议设置这个值到6或者7,最多8。6对应的connect超时为45s,7对应90s,8对应190s.

    你能通过以下命令修改该值:
    sysctl -w net.ipv4.tcp_syn_retries=6

    查看该值的命令是:
    sysctl net.ipv4.tcp_syn_retries

    如果希望重启后生效,将net.ipv4.tcp_syn_retries = 6放入/etc/sysctl.conf中。

    英文原文:http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout

    系统调优:http://blog.csdn.net/largetalk/article/details/16863689


    展开全文
  • 设置connect超时

    2016-09-29 11:11:43
    TCP一般默认的connect超时时间为75s,相对较长,可以自定义超时时间,使得超时时间短于75s typedef sighandler_t Sigfunc static void connect_alarm(int); int connect_timeout(int sockfd, const ...
  • int function(string ip, WORD wPort ) { sockaddr_in stServerAddress; int stSocket = socket(AF_INET,SOCK_STREAM,0); memset( &stServerAddress,0,sizeof( sockaddr_in...// 设置为默认值 stServerAddress.si
  • 1.PHP在使用ssh2_connect...2.socket_connect超时时间可以在php.ini中设置default_socket_timeout来进行超时设置,默认时间未60秒, 3.也可以在ssh函数执行前单独设置超时时间 ini_set('default_socket_timeout', 10
  • linux平台下的socket 通过设置超时时间可以在connect的时候进行超时判断,而windows设置超时对connect不起作用,默认大概是16s。 以下是windows平台下connect超时的示例代码。可以直接编译运行。 #include <...
  • connect超时设置

    千次阅读 2013-12-31 00:05:59
    socket编程中,当客户端用connect()去连接一个服务端是,如果服务器或网络繁忙,或连接了一个未开机的主机时,客户端发送的SYN包得不到响应,connect函数会很久不返回...connect超时时间与/proc/sys/net/ipv4/tcp_
  • lua tcp connect超时设置

    2020-04-06 15:26:06
    lua tcp connect连接服务器超时时间默认120秒,太长了,怎么自定义超时时间
  • 无论你用任何语言或者是网络库,你都可以设置网络操作的超时时间,特别是connect、read、write的超时时间。 你可以在代码中把超时时间设置任意大小值,但是connect方法会有一点特殊。 connect超时时间在任意的...
  • 设置socket connect超时时间的几种方法

    万次阅读 2019-08-01 12:34:40
    SYN重传次数影响connect超时时间,当重传次数为6时,超时时间为1+2+4+8+16+32+64=127秒。 int syncnt = 4 ; setsockopt ( sock , IPPROTO_TCP , TCP_SYNCNT , & syncnt , sizeof ( syncnt ) ) ; ...
  • 设置TCP connect超时时间的2种方法

    千次阅读 2018-02-07 22:27:14
    设置socket非阻塞,之后使用select等设置超时时间 2.使用alarm信号量 需要注意:线程信号量掩码是线程私有的,当指定进程递交信号量时,操作系统会将信号量递交至该进程中未屏蔽该信号量的所有线程中的随机之一。 见...
  • socket connect超时设置

    2021-01-07 18:20:57
    场景:客户端调用接口时,默认调用的超时时间会很长,可以通过设置发送的超时时间来控制。 int create_server_socket(const char *node_ip, int port) { int sockfd; int sendbytes; char buf[MIDLEN] = ""; ...
  • connect超时时间过长

    2012-06-06 09:31:33
    connect连接时如果跨网段会...2.但是实际上还可以设置非阻塞,然后select,这样也会卡,但是这个卡的时间可以自己去设定,那么卡2,3秒是可以满足目前的需求的 #define CONNECT_TIME_OUT 3 [code="c++"] ...
  • linux下socket connect超时设置

    万次阅读 2016-01-20 10:34:38
    今天发现自己的系统存在很严重缺陷,当前台关闭的时候后台就无法正常工作,原因很好定位,后台的socket连接超时时间过长,系统默认...如何设置socket的Connect超时(linux) [From]http://dev.cbw.com/c/c/20051019
  • connect超时时间的一点探讨<转>

    千次阅读 2012-07-02 17:38:10
    connect超时时间的一点探讨 前言: 对阻塞的connect到底会多久超时(返回-1,并且errno被设为ETIMEDOUT)一直也没有搞清楚,今天花时间 看了一下代码并作了一点实验,大致得出了一点结论。没有时间写的太细了...
  • Socket connect() 设置超时时间

    千次阅读 2018-05-02 14:16:58
    Socket connect() 设置超时时间 1,linux或者win32控制台程序中connect函数默认是阻塞的,成功则返回0,失败返回-1,错误码可以用函数GetLastError获得。如果连接一个打开的服务器一般回立即返回并且成功连接socket...
  • accept与connect超时设置

    万次阅读 2015-12-11 22:46:28
    connect超时: 我们都知道,connect对应与三次握手中的第一次发送SYN,而对待服务器的ACK,如果服务器没有启动服务器,有些机器会立刻返回一个RST表示...所以需要设置connect的超时时间。 利用select设置connect的超
  • 查看了jdk的api后,Socket的connect(SocketAddress endpoint, int timeout)第二个参数是可以设置超时时间的,在时间没有到之前,连接请求会一直阻塞。 我代码如下: try { String path = "/"; String host = ...
  • //设置1秒超时 int ret = connect( sock, ( struct sockaddr* )&server_address, sizeof( server_address ) ); alarm(0); sigrelse(SIGALRM); printf("connect ret code is: %d\n", ret); if ( ret == 0 ) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,998
精华内容 43,999
关键字:

connect超时时间配置