c - TCP监听并在监听的同时做其他事情

标签 c sockets tcp listener

所以我有一个 C 代码设置为客户端和服务器。我需要做的是能够在每次打印菜单后检查是否有人尝试与我建立连接。如果有人尝试过,请与他们联系。如果他们还没有尝试过,请再次打印菜单。我目前正在服务器上监听,但如何设置它以便我可以检查我的监听队列而不让它阻塞我的代码。就像一张小支票,看看某人是否拥有。

最佳答案

这可能有帮助:Trouble with socket connection in C and Linux 。我遇到了麻烦,因为只能建立一个连接,而服务器会在之后删除客户端。正如上面的帖子所述,您想要接受连接,而不是启动一个将作用于新客户端套接字的新线程或派生一个将处理客户端的新进程。无论哪种方式都有效,但网上似乎有更多使用 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;
}

代码仍然有点粗糙,但希望您能够了解如何处理多个连接。

关于c - TCP监听并在监听的同时做其他事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26706222/

相关文章:

c - 了解编译 C 代码时发生错误的阶段

c - 如何从在 Visual Studio 中定义它的函数外部查看静态变量?

c# - 在 C# 中使用 RSA 加密套接字通信

c - Linux线程C服务器

c - channel 未阻塞时 libssh2_channel_write 的行为

tcp - 如何通过 vidalia tor 重定向 Windows 中的所有流量?

iphone - Objective-C 输出流刷新问题?

java - 构建套接字通信以最小化数据传输

c - unregister_chrdev 不会从/dev/中删除设备

c - memcpy 花费的时间在某个点后减少