【发布时间】:2014-06-07 05:03:56
【问题描述】:
我保证,这不是作业问题。
我正在编写时间序列数据库实现作为学习 C 的一种方式。
我已经编写了一个客户端/服务器对。该服务器当前是一个监听端口上的套接字的回显服务器。客户端连接到该端口并向其发送输入行。它使用readline 获取输入,sends 将其发送到客户端套接字,recvs 来自客户端套接字的一行,并将该行打印到终端。冲洗,重复。客户端在从recv 获得EOF 时返回,此时它知道连接已关闭。
问题是readline被阻塞了,所以如果服务器进程被杀死,即我SIGINT它,客户端仍然阻塞readline。直到sends,然后是recvs 和EOF,它才会知道服务器已经消失。
我想要发生的事情是,如果recv 上有EOF,客户端会收到信号并立即退出。
我认为我需要做的是为网络客户端(send 和recv)创建 3 个pthreads - 2,为终端创建 1 个。终端调用readline 并阻止。它接受输入,然后使用pthread_cond_t 向等待的网络客户端send 线程发送信号。网络客户端recv线程不断recving,会阻塞。如果它是EOF,它会引发SIGINT,pthread_kills 所有 3 个线程的处理程序,fprintfs 类似于“连接被服务器关闭”,并调用exit(是的,我知道exit 无论如何都会终止所有线程 - 这是一个清洁练习,看看我是否理解 C)。
这是合适的方法吗?显然,网络客户端一直都在这样做。什么是正确的方法?
【问题讨论】:
-
没有一种正确的方法。经典参考是 Rich Stevens 的 UNIX Network Programming
-
@arayq2 谢谢!我去看看!
-
"它使用 readline 来获取输入..." "它"是谁,客户端还是服务器?
-
并且:一个不会发送“到套接字”而是“通过”一个套接字“到”一些目的地(这里是客户端服务器),因为大多数情况下套接字是双向使用的。
标签: c sockets pthreads signals