繁体   English   中英

如何让每个子进程获得不同的客户端地址(UDP SOCKET)?

[英]How can I make every child process get a different client address (UDP SOCKET)?

我有个问题 :
- 对于客户端发送的每条消息,服务器都会创建一个子进程(fork()),并且每个消息都由另一个子进程读取。
问题:
- 有什么方法可以擦除sockaddr_in结构,这样当服务器在无限循环中再次进入一个时,它会等待一个不同的客户端,每个孩子都会有一个不同的客户端地址。

A part of the server code:

    struct sockaddr_in from;
    int main(int argc, char *argv[]) {
            int32_t stringLen;
            initSocket();
            printf("waiting for a connection\n");
            while (true) {
                int n;
                socklen_t length = sizeof(struct sockaddr_in);
                n = recvfrom(sock, &stringLen, sizeof(stringLen), 0,
                        (struct sockaddr *) &from, &length);
                if (n > 0) {
                    int pid = fork();
                    printf("fork() pid = %d\n", pid);
                    if (pid < 0) {
                        error("handling request");
                    }
                    if (pid == 0) {
                        printf("Client connected...\n");
                        handle_request(stringLen);
                    }
                    cout << " PID : " << pid << endl;
                }
            }
        }

Thank you ! 

正如我在评论中已经提到的:读取是由同一个套接字上的所有进程完成的,因为后者在fork()时被复制。

你最好让父母读取整个消息,然后fork()关闭传递读取消息的子节点,然后重新开始阅读下一条消息。

如果fork()创建新进程,则可以通过文件IO简单地执行同步操作。 通过读取和写入相同的配置文件,子进程可以从文件中获取可用的套接字地址

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM