连接(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是通常的一个
    此处列出的错误代码,解释失败的原因)。