所以我将C代码设置为客户端和服务器。我需要做的是能够检查每次我的菜单打印后是否有人试图与我建立连接。如果有人尝试过,请与他们联系。如果他们没有尝试过,请再次打印菜单。我目前正在监听服务器但是如何设置它以便我可以检查我的监听队列而不会阻止我的代码。就像一张小支票,看看有没有人。
答案 0 :(得分:0)
这可能有所帮助: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;
}
代码仍然有点粗糙,但希望您能够了解如何处理多个连接。