【发布时间】:2018-03-17 15:18:39
【问题描述】:
我正在尝试在 Linux 中使用 C 实现 TCP 服务器。我希望这台服务器永远接受来自多个客户端的传入数据,同时每 3 秒将一些数据发送回每个连接的客户端。
我的问题是我不知道如何在与处理客户的过程不同的过程中正确执行send()。
我正在做的是在程序的开头做一个fork()然后做
while (1) {
sleep(3);
// compute and `send()` data to each connected peers
}
在子进程中,做
sock = create_socket();
while (1) {
client_sock = accept_connection(sock);
if (fork() == 0) {
close(sock);
handle_client(client_sock);
exit(0);
}
close(client_sock);
// clean up zombies
}
在父进程中。 handle_client() 只是recv() 无限循环中的数据。因为send() 和recv() 是在不同的进程中执行的,所以我不能在父进程中使用send() 的套接字文件描述符。我需要在父进程中做什么才能执行send()?
【问题讨论】:
-
如果在父节点中完成了接受,然后分叉完成,则客户端和服务器共享客户端套接字并可以在其上发送/接收。它不适用于 SSL 套接字,因为 SSL 状态保存在用户空间中,即每个进程都有一个单独的状态。无论如何,我认为这从一开始就是一个糟糕的设计,您应该改用线程或基于事件的编程,从而将所有内容都放在一个进程中。
-
事件驱动编程对我来说是新的,但我一定会看看它。谢谢!
-
@SteffenUllrich 基本的 Apache 工作正如你所说,通过分叉,并且处理 SSL 很好......所以它不一定是一个糟糕的设计。与其他任何一种方法一样,它也有其优点和缺点。
-
@PatrickMevzek:Apache 不像 OP 喜欢那样使用一个进程来接收和另一个进程在同一个套接字上发送数据。它使用相同的子进程进行发送和接收,这对 SSL 来说也很好,因为只有一个进程包含 SSL 状态。
-
我认为 OP 只是没有正确指定它的问题,因为没有特定的限制,我认为没有理由在单独的进程中进行读写;所以可能只是因为不知道如何处理
accept()。
标签: networking process c sockets