TCP在收听时收听和做其他事情

TCP在收听时收听和做其他事情,c,sockets,tcp,listener,C,Sockets,Tcp,Listener,因此,我将C代码设置为客户端和服务器端。我需要做的是,每次我的菜单打印出来后,检查是否有人试图与我建立连接。如果有人尝试过,请与他们联系。如果他们没有尝试,请再次打印菜单。我当前正在服务器上侦听,但如何设置它,以便在不让侦听队列阻塞代码的情况下检查侦听队列。比如一张小支票,看看某人是否有。这可能会有所帮助:。我遇到的问题是,只能建立一个连接,而服务器会在事后删除客户端。如上所述,您希望接受连接,而不是启动一个新线程来处理新的客户机套接字,或者派生一个新进程来处理客户机。这两种方法都有效,但似乎有

因此,我将C代码设置为客户端和服务器端。我需要做的是,每次我的菜单打印出来后,检查是否有人试图与我建立连接。如果有人尝试过,请与他们联系。如果他们没有尝试,请再次打印菜单。我当前正在服务器上侦听,但如何设置它,以便在不让侦听队列阻塞代码的情况下检查侦听队列。比如一张小支票,看看某人是否有。

这可能会有所帮助:。我遇到的问题是,只能建立一个连接,而服务器会在事后删除客户端。如上所述,您希望接受连接,而不是启动一个新线程来处理新的客户机套接字,或者派生一个新进程来处理客户机。这两种方法都有效,但似乎有更多的在线示例使用fork方法。如果你能发布你的代码,我可以看一下,看看是否能提供一些帮助

我忘了回答问题后我没有把正确的代码放上去。此后唯一更改的代码是accept函数

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之前启动另一个线程,并在新线程中执行其他操作