我有一个正常的服务器和客户端TCP C程序,它使用套接字。当服务器首先启动时(即服务器调用listen(),然后等待客户端调用connect()),它就完美地工作了。
现在,我要实现的是先启动客户端,然后在以后任何时候启动服务器的情况。
客户端应该继续尝试连接到服务器。在服务器关闭之前,我知道客户机的connect()调用将返回-1;但是客户机应该一直尝试,直到建立成功的连接。
目前,在客户端,我试图在一个connect()循环中调用while,但是如果服务器在客户端运行时没有监听,它将无法工作。
客户端连接代码:
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()吗?如果是,怎么做?
发布于 2022-03-22 03:13:45
你的代码基本上是正确的。但是,您需要在每次循环迭代中关闭并重新创建套接字(参见Does socket become unusable after connect() fails?),例如:
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;
}
}https://stackoverflow.com/questions/71565094
复制相似问题