首页 »Java教程 » linuxsocket超时:Linux下Socket连接超时的一种实现思路方法 »正文
linuxsocket超时:Linux下Socket连接超时的一种实现思路方法
来源: 发布时间:星期三, 2008年12月17日 浏览:43次 评论:0
目前各平台通用 设置套接字(Socket)连接超时 办法是:
- 创建套接字将其设置成非阻塞状态
- connect连接对端主机如果失败判断当时errno是否为EINPROGRESS也就是说是不是连接正在进行中如果是转到步骤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) {
|