连接(function)错误时正在进行操作错误
我想设置函数connect的超时值,但是我收到此错误:“操作正在进行中”
我的代码:
if ((he = gethostbyname(authdefhost)) == NULL) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot resolve %s: %s\n", authdefhost, hstrerror(h_errno)); return -1; } sin.sin_family = AF_INET; memcpy(&sin.sin_addr, he->h_addr_list[0], sizeof(struct in_addr)); if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot create client socket: %s\n", strerror(errno)); return -1; } if ((fcntl(sd, F_SETFL, O_NONBLOCK) < 0)) printf("error on setting socket flags."); if (connect(sd, (void *) & sin, sizeof(sin)) == -1) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot connect to server %s: %s\n", authdefhost, strerror(errno)); close(sd); return -1; } FD_ZERO(&fdset); FD_SET(sd, &fdset); int rv; if ((rv = select(sd + 1, NULL, &fdset, NULL, &tv)) == -1) { printf("error occurred on select function."); return -1; } else if (rv == 0) { printf("time out occurred."); return -1; } else { printf("connection established"); return sd; }
当您在非阻塞套接字上调用connect()
时,您将获得EINPROGRESS
而不是阻塞等待连接握手完成。 然后,您必须select()
表示可写性,并检查套接字错误以查看连接是否已完成。
从Linux的connect()
页 :
EINPROGRESS 套接字是非阻塞的,无法完成连接 立即。 可以选择(2)或轮询(2)完成 选择套接字进行写入。 选择(2)后表示 可写性,使用getsockopt(2)来读取级别的SO_ERROR选项 SOL_SOCKET确定connect()是否成功完成 (SO_ERROR为零)或失败(SO_ERROR是通常的一个 此处列出的错误代码,解释失败的原因)。