专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » linuxsocket超时:Linux下Socket连接超时的一种实现思路方法 »正文

linuxsocket超时:Linux下Socket连接超时的一种实现思路方法

来源: 发布时间:星期三, 2008年12月17日 浏览:43次 评论:0
目前各平台通用设置套接字(Socket)连接超时办法是:


  1. 创建套接字将其设置成非阻塞状态
  2. connect连接对端主机如果失败判断当时errno是否为EINPROGRESS也就是说是不是连接正在进行中如果是转到步骤3如果不是返回
  3. 用select在指定超时时间内监听套接字写就绪事件如果select有监听到证明连接成功否则连接失败
  以下是Linux环境下举例代码:


# <stdlib.h>
# <stdio.h>
# <unistd.h>
# <fcntl.h>
# <sys/types.h>
# <sys/.h>
# <netinet/in.h>
# <errno.h>
# <time.h>

( argc, char *argv[])
{
         fd, retval;
        struct sockaddr_in addr;
        struct timeval timeo = {3, 0};
        socklen_t len = (timeo);
        fd_ ;

        fd = (AF_INET, SOCK_STREAM, 0);
         (argc == 4)
                timeo.tv_sec = atoi(argv[3]);
        fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr(argv[1]);
        addr.sin_port = htons(atoi(argv[2]));
        prf("%d\n", time(NULL));
         (connect(fd, (struct sockaddr*)&addr, (addr)) == 0) {
                prf("connected\n");
                 0;
        }
         (errno != EINPROGRESS) {
                perror("connect");
                 -1;
        }
        FD_ZERO(&);
        FD_SET(fd, &);
        retval = select(fd + 1, NULL, &, NULL, &timeo);
         (retval == -1) {
                perror("select");
                 -1;
        } (retval == 0) {
                fprf(stderr, "timeout\n");
                prf("%d\n", time(NULL));
                 0;
        }
        prf("connected\n");

         0;
}


 

[root@lanhai-linux CONNI]# ./coni 10.16.101.1 90
1223898556
timeout
1223898559
[root@lanhai-linux CONNI]# ./coni 10.16.101.1 90
1223898609
timeout
1223898612
[root@lanhai-linux CONNI]# ./coni 192.168.18.45

[root@lanhai-linux CONNI]# ./coni 192.168.18.45 90
1223898767


[root@lanhai-linux CONNI]# ./coni 192.168.18.37 80
1223898771
connected
[root@lanhai-linux CONNI]#




相关文章

读者评论

发表评论

  • 昵称:
  • 内容: