首页 > 解决方案 > c语言中带有fork的udp服务器多进程

问题描述

我需要为我的 udp 服务器上的某个客户端在 c 中创建的每个新“连接”创建一个新进程

我需要有多个用户,所以我使用 fork。

我的问题是服务器收到的消息并为每条消息创建一个新进程

代码片段说明,问题在于 recvfrom 函数中收到的每条新消息都会创建一个新进程,即使它是同一个进程。我需要为每个实例化的新进程,即客户端 x,将消息发送到同一个进程

 while (1) {
        printf("\UDP Server: waiting connection...");
        bytes = recvfrom (sock, (char *)&frame_recv, sizeof(Frame), MSG_WAITALL, (sock_addr*) &client, &size_client);

        if (bytes > 0) {
            buffer[bytes] = '\0';
            printf("\nServidor UDP: message -> %s", buffer);
            pid = fork();

            if (pid < 0) {
                perror("UDP Serve: ERRO in while forking \n");
                exit(1);
            }

            if (pid == 0) {
                sendto(
                   socket,
                   (const char *)&frame_send,
                   sizeof(Frame),
                   MSG_CONFIRM,
                   (sock_addr*)&server,
                   sizeof(server)
                );
            }
        }
    }

所以为了做到这一点,我使用了三次握手,下面的代码片段缩小了我所说的范围。我有第一个 sock 来“建立”连接,服务器以 ack 和客户端必须与之通信的新端口进行响应,从而创建新进程并启动该客户端功能

   while (true) {
        bytes = recvfrom (sock, (char *)&frame_recv, sizeof(Frame), MSG_WAITALL, (sock_addr*) &client, &size_client);
        if(bytes > 0) {
            pid = fork();

            if(pid == 0) {
                client();
            }
            if(pid < 0) {
                perro("bad Forking");
                exit(-2);
            }
        }
    }

在此客户端函数中,我创建了一个新套接字并将其绑定为新端口,因此进程 x 仅在侦听客户端,在该进程中我得到一个新的同时侦听消息 void client(void) {

bindSock(&new_server, new_sockt);

while (true) {
    printf("PID: %i\n", getpid());

    bytes = recvfrom(new_socket, (char *) &new_frane_recv, sizeof(Frame), MSG_WAITALL, (sock_addr *) &new_client, &new_size_client);

    if (bytes > 0) {
        iniciaCliente(&(new_frane_recv), new_sockt, new_client);
    }
}

}

我的问题是我无法让操作系统生成随机端口,当我使用getsockname时它总是返回零。

我想知道我所做的一切是否也有效?因为我为每个客户端创建了一个带有一台服务器的新进程。

这是一份大学工作,我必须使用 udp 和 fork

对不起这个巨大的问题,我有点迷路'-'

标签: csocketsudpmultiprocessingfork

解决方案


推荐阅读