首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户端调用connect()而服务器不调用listen()

客户端调用connect()而服务器不调用listen()
EN

Stack Overflow用户
提问于 2022-03-21 22:56:08
回答 1查看 119关注 0票数 0

我有一个正常的服务器和客户端TCP C程序,它使用套接字。当服务器首先启动时(即服务器调用listen(),然后等待客户端调用connect()),它就完美地工作了。

现在,我要实现的是先启动客户端,然后在以后任何时候启动服务器的情况。

客户端应该继续尝试连接到服务器。在服务器关闭之前,我知道客户机的connect()调用将返回-1;但是客户机应该一直尝试,直到建立成功的连接。

目前,在客户端,我试图在一个connect()循环中调用while,但是如果服务器在客户端运行时没有监听,它将无法工作。

客户端连接代码:

代码语言:javascript
复制
while( 1)
    {
        
        for(int j=0; j<argc-3; j++){
            //sockfd of each server needed to be connect()ed is stored in array all_sock_fd[]

            if ((sender_conn=connect(all_sock_fd[j], (struct sockaddr *)&all_sockaddrs[j],sizeof(struct sockaddr)) == -1)) {
                
                //do nothing if fails
            }
            else{ //if connection successful then create a thread for that connection
                if( pthread_create( &thread_id , NULL ,  you_connect_to_others , (void*) &all_sock_fd[j]) < 0)
                {
                    perror("could not create thread");
                    return 1;
                }
                
            }
        }
}

当服务器在客户端调用listen()-ing之前已经是connect()时,上面的代码可以正常工作。但是,如果客户端在服务器之前运行(即,如果服务器在客户端之后2秒启动),则此代码将永远不会连接。

我尝试了while循环方法,客户端一直试图调用connect(),希望当服务器最终调用listen()时,将建立一个连接。

但这行不通。即使在客户端之后打开服务器,连接也不会发生。

我可以使用select()poll()吗?如果是,怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-22 03:13:45

你的代码基本上是正确的。但是,您需要在每次循环迭代中关闭并重新创建套接字(参见Does socket become unusable after connect() fails?),例如:

代码语言:javascript
复制
for(int j = 0; j < argc-3; j++){
    //sockfd of each server needed to be connect()ed is stored in array all_sock_fd[]
    int sockfd;
    while (1)
    {
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0)
        {
            perror("could not create socket");
            return 1; 
        }

        sender_conn = connect(sockfd, (struct sockaddr *)&all_sockaddrs[j], sizeof(all_sockaddrs[j]));
        if (sender_conn == 0) break;

        // examine errno and decide whether it is reasonable to continue retrying

        close(sockfd);

        //wait a few seconds and try again
        sleep(5);
    }

    //connection successful, create a thread for that connection
    all_sock_fd[j] = sockfd;
    if (pthread_create(&thread_id, NULL, you_connect_to_others, (void*) &all_sock_fd[j]) < 0)
    {
       perror("could not create thread");
       close(all_sock_fd[j]);
       all_sock_fd[j] = -1;
       return 1; 
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71565094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档