TCP在收听时收听和做其他事情
因此,我将C代码设置为客户端和服务器端。我需要做的是,每次我的菜单打印出来后,检查是否有人试图与我建立连接。如果有人尝试过,请与他们联系。如果他们没有尝试,请再次打印菜单。我当前正在服务器上侦听,但如何设置它,以便在不让侦听队列阻塞代码的情况下检查侦听队列。比如一张小支票,看看某人是否有。这可能会有所帮助:。我遇到的问题是,只能建立一个连接,而服务器会在事后删除客户端。如上所述,您希望接受连接,而不是启动一个新线程来处理新的客户机套接字,或者派生一个新进程来处理客户机。这两种方法都有效,但似乎有更多的在线示例使用fork方法。如果你能发布你的代码,我可以看一下,看看是否能提供一些帮助 我忘了回答问题后我没有把正确的代码放上去。此后唯一更改的代码是accept函数TCP在收听时收听和做其他事情,c,sockets,tcp,listener,C,Sockets,Tcp,Listener,因此,我将C代码设置为客户端和服务器端。我需要做的是,每次我的菜单打印出来后,检查是否有人试图与我建立连接。如果有人尝试过,请与他们联系。如果他们没有尝试,请再次打印菜单。我当前正在服务器上侦听,但如何设置它,以便在不让侦听队列阻塞代码的情况下检查侦听队列。比如一张小支票,看看某人是否有。这可能会有所帮助:。我遇到的问题是,只能建立一个连接,而服务器会在事后删除客户端。如上所述,您希望接受连接,而不是启动一个新线程来处理新的客户机套接字,或者派生一个新进程来处理客户机。这两种方法都有效,但似乎有
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;
}
代码仍然有点粗糙,但希望您能够了解如何处理多个连接 总之,选择。代码不应该关心有多少人正在尝试连接。在检查了listen的返回代码之后,下一条指令应该是accept,它通常会阻塞。当执行传递到accept之后的下一条指令时,accept的返回值是用于与客户端通信的套接字编号。要在侦听/接受时执行其他操作,请在调用listen之前启动另一个线程,并在新线程中执行其他操作