我有一個使用套接字的普通服務器和客戶端 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()為此嗎?如果是這樣,如何?
uj5u.com熱心網友回復:
您的代碼大部分是正確的。但是,您需要在每次回圈迭代時關閉并重新創建套接字(請參閱Connect() 失敗后套接字是否變得不可用?),例如:
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://www.uj5u.com/net/447837.html
