0
所以我將C代碼設置爲客戶端和服務器。我需要做的是能夠檢查每次打印菜單後是否有人嘗試與我建立連接。如果有人嘗試過,請與他們聯繫。如果他們還沒有嘗試過,請再次打印菜單。我目前正在監聽服務器,但是如何設置它,以便我可以檢查我的監聽隊列而不阻止我的代碼。就像一個小檢查,看看有沒有人。TCP在監聽時做其他事情
所以我將C代碼設置爲客戶端和服務器。我需要做的是能夠檢查每次打印菜單後是否有人嘗試與我建立連接。如果有人嘗試過,請與他們聯繫。如果他們還沒有嘗試過,請再次打印菜單。我目前正在監聽服務器,但是如何設置它,以便我可以檢查我的監聽隊列而不阻止我的代碼。就像一個小檢查,看看有沒有人。TCP在監聽時做其他事情
這可能有所幫助:Trouble with socket connection in C and Linux。我只能建立一個連接而服務器放棄客戶端後,卻遇到了麻煩。正如上面的帖子所說的,你想要接受連接,而不是啓動一個新的線程來處理新的客戶端套接字,或者分叉一個新的處理客戶端的進程。無論哪種方式工作,但似乎有更多的例子在線使用fork方法。如果你可以發佈你的代碼,我可以看看它,看看我能否提供一些幫助。
我忘了在問題得到解答後我沒有更正糾錯碼。自那時以來已更改的唯一代碼是接受功能
int server_accept_connections(server *serv, int (*process_data)(char *buffer, ssize_t length, int client_scoket))
{
int result = 0;
int length = sizeof((serv)->client_addr);
char *buffer = (char *) malloc(sizeof(char) * 250);
if (buffer) {
while (result == 0) {
serv->client_socket = accept(serv->sockfd, (struct sockaddr *)(serv)->client_addr, &length);
pid_t pid = fork();
if (pid < 0)
result = -1;
else if (pid == 0) { /* client code */
close(serv->sockfd); //the client doesn't need to listen
ssize_t data_length = recv(serv->client_socket, buffer, sizeof(buffer), 0);
result = (* process_data)(buffer, data_length, serv->client_socket);
close(serv->client_socket);
break; //have the child leave the while loop -- probably not what I want
}
else {
close(serv->client_socket);
}
}
}
else
result = -1;
free(buffer);
return result;
}
的代碼還是有點粗糙,但希望你能得到如何處理多個連接的想法。
總之,'select()。' – EJP 2014-11-03 00:45:44
代碼不應該關心有多少人試圖連接。在檢查listen()的返回碼後,下一條指令應該是accept(),它通常是阻塞的。當accept後的執行轉到下一個指令時,accept的返回值是一個用於與客戶端通信的套接字號。在聆聽/接受時做其他事情,在調用listen()之前啓動另一個線程並在新線程中執行其他操作 – user3629249 2014-11-03 00:53:15