【问题标题】:Operation now in progress error on connect( function) error连接(函数)错误上的操作正在进行中的错误
【发布时间】:2011-09-06 08:15:23
【问题描述】:

我想设置函数 connect 的超时值,但我得到这个错误:“Operation now in progress”

我的代码:

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

【问题讨论】:

    标签: c sockets network-programming


    【解决方案1】:

    当您在非阻塞套接字上调用 connect() 时,您将获得 EINPROGRESS 而不是阻塞等待连接握手完成。然后,您必须select() 进行可写性,并检查套接字错误以查看连接是否已完成。

    来自 Linux 的connect() manpage

    EINPROGRESS
    
        套接字是非阻塞的,无法完成连接
        立即地。可以通过 select(2) 或 poll(2) 完成
        选择要写入的套接字。 select(2) 后表示
        可写性,使用 getsockopt(2) 读取级别的 SO_ERROR 选项
        SOL_SOCKET 判断 connect() 是否成功完成
        (SO_ERROR 为零)或不成功(SO_ERROR 是常见的一种
        此处列出的错误代码,解释了失败的原因)。
    
    

    【讨论】:

    • 简而言之:这是意料之中的。您需要在connect() 的错误检查路径中专门检查errno != EINPROGRESS
    • UNIX Network Programming (Volume 1)Chapter 16 Nonblocking I/O 详细描述了这个特性并提供了一个演示。
    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多