在上一版本的回射程序中,若服务器子进程被杀死,则客户端检测不到这一事件的发生。原因在于,子进程被杀死时,虽然发送了FIN给客户端套接字,但此时客户端进程是阻塞于等待标准输入上的,因此检测不到套接字的输入。解决办法就是使用I/O多路复用。如下图所示:
另一个问题:若输入是批量输入,则输入结束后,客户端检测到EOF,则客户端会关闭连接,而网络中还有其他请求和应答,则会发现输出比输入少的现象,如下图所示
当全部的9个请求发出后,则会关闭连接,而此时只有应答1被接收到,其他的会丢失。
解决办法就是请求全部发送后,只关闭套接字写的那端,不关闭读的那端,也即半关闭状态
为此,使用了select来进行I/O多路复用。程序如下:
客户端:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/time.h>
#define err_exit(m)\

在之前的回射程序中,当服务器子进程被杀死时,客户端无法检测到这一变化。原因是客户端阻塞于标准输入,无法感知套接字状态。为了解决这个问题,引入了I/O多路复用技术,特别是使用了select函数。另一个挑战是批量输入后,客户端在检测到EOF时关闭连接,导致后续请求和响应丢失。为防止这种情况,采用了只关闭写端保持半关闭状态的策略。通过这些改进,优化后的程序能够更有效地处理网络通信。
最低0.47元/天 解锁文章
1178

被折叠的 条评论
为什么被折叠?



