目前正在运行操作错误的连接(功能)错误 [英] Operation now in progress error on connect( function) error

查看:108
本文介绍了目前正在运行操作错误的连接(功能)错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想设置的功能超时值连接,但我得到这个错误:正在进行操作

我的code:

  IF((他的gethostbyname =(authdefhost))== NULL){
        的snprintf(errbuf,CERRBUFSIZ - 1,无法解析%S:%S \\ n,authdefhost,hstrerror(h_errno));
        返回-1;
}sin.sin_family = AF_INET;
的memcpy(安培; sin.sin_addr,他 - > h_addr_list [0]的sizeof(struct in_addr,这个));如果((SD =插座(AF_INET,SOCK_STREAM,0))小于0){
        的snprintf(errbuf,CERRBUFSIZ - 1,不能创建客户端套接字:%S \\ n字符串错误(错误));
        返回-1;
}如果((的fcntl(SD,F_SETFL,O_NONBLOCK)℃下))
    的printf(错误上设置插座的标志。);如果(连接(SD,(无效*)及罪的sizeof(SIN))== -1){
        的snprintf(errbuf,CERRBUFSIZ - 1,无法连接到服务器%S:%S \\ n,authdefhost,字符串错误(错误));
        关闭(SD);
        返回-1;
}FD_ZERO(安培; fdset);
FD_SET(SD,&安培; fdset);
INT RV;
如果((RV =选​​择(SD + 1,NULL,&安培; fdset,NULL,&安培;电视))== -1){
    的printf(关于选择功能发生错误。);
    返回-1;
}
否则,如果(RV == 0){
    的printf(超时的发生。);
    返回-1;
}
其他{
    的printf(建立连接);
    返回SD;
}


解决方案

当你调用连接()非阻塞套接字上,您将获得 EINPROGRESS 而不是阻塞等待连接握手来完成。然后,你必须选择()可写,并检查插座的错误,看看是否连接已经完成。

从Linux的 连接()手册页

 EINPROGRESS    套接字是非阻塞,连接无法完成
    立即。这是可能的选择(2)或poll(2)通过完成
    选择用于写入的插座。后选择(2)表示
    可写性,使用setsockopt(2)阅读水平SO_ERROR选项
    SOL_SOCKET以确定是否连接()成功完成
    (SO_ERROR是零)或失败(SO_ERROR是通常的一个
    错误codeS列在这里,解释失败的原因)。

I want to set timeout value of function connect but I get this error: "Operation now in progress"

My code:

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

解决方案

When you call connect() on a non-blocking socket, you'll get EINPROGRESS instead of blocking waiting for the connection handshake to complete. Then, you have to select() for writability, and check the socket error to see if the connection has completed.

From Linux's connect() manpage:

EINPROGRESS

    The socket is nonblocking and the connection cannot be completed
    immediately.  It is possible to select(2) or poll(2) for completion by
    selecting the socket for writing.  After select(2) indicates
    writability, use getsockopt(2) to read the SO_ERROR option at level
    SOL_SOCKET to determine whether connect() completed successfully
    (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual
    error codes listed here, explaining the reason for the failure).

这篇关于目前正在运行操作错误的连接(功能)错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆