从客户端发送到客户端 TCP/fork/socket

问题描述 投票:0回答:1

我正在尝试写一个聊天程序,协议是TCP,两个文件是server.c和client.c 如果消息是通过 fork 发出的并且具有相同的套接字描述符,如何从客户端发送消息到客户端。

无论我如何尝试发送消息,它都会出现在与发送消息相同的控制台窗口中

c linux sockets tcp fork
1个回答
0
投票

问题在于,每当您

fork()
时,创建的子进程都是一个具有自己状态的独立进程。它将继承其父进程的文件描述符,但在此之后,稍后在父进程中创建的任何文件描述符将在(已存在的)子进程中不可用。

这意味着例如如果您的服务器接收到第一个 TCP 连接并创建文件描述符 123 来表示它,并派生一个子进程来处理它,然后接收第二个 TCP 连接,创建文件描述符 124 来表示它,并派生第二个子进程来处理它也就是说,第一个子进程将根本无法使用文件描述符 124,因为该文件描述符从未出现在该子进程中。

如果您想让子进程向其他子进程发送数据,最好的办法是让子进程将数据发送给父进程,然后让父进程将该数据转发给所有其他子进程。但请注意,这并不是一件简单的事情,因为您需要通过每个子进程的 stdin/stdout 文件描述符传递此数据,或者使用

socketpair()
或类似工具设置您自己的与每个子进程的连接。

如果您想避免所有这些复杂性,您可能最好生成线程而不是分叉子进程,因为这样所有线程至少都可以访问所有文件描述符(因为它们都在同一内存中执行)空间在一起)。然后,您需要处理锁定/同步/所有权问题,以确保所有这些线程安全地访问文件描述符。

第三种选择是在单个线程中执行所有服务器操作,使用非阻塞 I/O 和

select()
poll()
来复用 I/O 操作。这是我通常默认所做的,因为尽管实现起来有点复杂,但根据我的经验,它仍然是三种方法中最简单的,可以 100% 正确。

© www.soinside.com 2019 - 2024. All rights reserved.