【问题标题】:how to write multi-user tcp server on c ++ sockets using fork system call如何使用 fork 系统调用在 C++ 套接字上编写多用户 tcp 服务器
【发布时间】:2022-01-02 15:32:20
【问题描述】:

我在 C++ 中的套接字上编写服务器和客户端。我有一台为一个客户端运行的服务器。告诉我如何使用fork编写多用户服务器。

服务器:

    int main() {
    int server_socket = Socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in adr = {0};
    adr.sin_family = AF_INET;
    adr.sin_port = htons(1110);

    Bind(server_socket, (struct sockaddr* )&adr, sizeof(adr));
    Listen(server_socket, SOMAXCONN);
    socklen_t adr_len = sizeof(adr);
    int res_accept = Accept(server_socket, (struct sockaddr* ) &adr, &adr_len);
    while(true) {
        char buffer[1024];
        ssize_t count_read = Recv(res_accept, buffer, 1024, 0);
        printf("%s\n", buffer);
        fflush(stdin);

        char res[10];
        int result = words_counter(buffer);
        sprintf(res, "%d\n", result);
        ssize_t count_send = Send(res_accept, res, 10, 0);
    }
    close(res_accept);
    close(server_socket);
    return 0;
}

客户:

    int main(int argc, char const *argv[]) {
    int client_socket = Socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in adr = {0};
    adr.sin_family = AF_INET;
    adr.sin_port = htons(1110);

    Inet_pton(AF_INET, "127.0.0.1", &adr.sin_addr);

    int res_connect = Connect(client_socket, (struct sockaddr* ) &adr, sizeof(adr));
    
    while (true) {

        char message[1024];

        printf("input message\n");

        fgets(message, 1024, stdin);

        if (strncmp(message, "quit!", 5) == 0) break;

        ssize_t count_send = Send(client_socket, message, 1024, 0);

        char buffer[10];

        ssize_t count_read = Recv(client_socket, buffer, 10, 0);

        printf("SERVER: The number of words in the transmitted message: %s", buffer);

    }

    close(client_socket);
    return 0;
}

我使用了bindlisten等自写的包装函数(方便错误处理)函数,所以函数名用大写字母书写。 谢谢你的帮助

【问题讨论】:

  • 为什么在你说你是用 C++ 写的时候这个标签是 C?
  • 是否涉及任何 C++ 特定代码?对我来说看起来像普通的 C。

标签: c linux tcp


【解决方案1】:

告诉我如何使用fork 编写多用户服务器。

我认为您是在询问如何使用fork 调整现有服务器以服务多个客户端。最简单的方法是

  1. 围绕从Accept() 调用到close(res_accept) 的所有内容进行循环。这提供了接受多个连接。如果您只想按顺序处理多个客户端,那么这将在没有任何分叉的情况下完成。但是为了能够同时处理多个客户端

  2. fork() 接受每个连接后。让(仅)孩子执行while 循环,然后执行_exit()。父级将跳过while 循环到close(res_accept)。这让父级可以接受更多的连接,而子级则可以处理与新接受的客户端的交互。

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2011-12-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多