现在是在一个树莓派上执行编写好的tcp服务器的程序,一旦有客户端连接上来,服务器就会不断的向客户端发送类似于心跳包的数据。现在的需求是,当客户端软件关闭,服务器不需要从新启动服务器上的tcp进程。
涉及到的主要是客户端断开连接后,服务器端继续send时,进程会退出,这是会涉及到信号SIGPIPE的知识,以及使用send中的最后参数或者sigaction的方法,避免进程被杀死。
根据上面的使用场景,首先想到的思路就是:1.检测客户端断开连接 -> 2.服务端从新监听客户端的连接 -> 3.更新服务端的发送和接收的socket
这里比较重要的就是第一步:检测客户端的连接。
比较简单常规的方法就是,当服务端调用send接口后,如果返回小于0,就直接判断客户端断开连接。这里使用window下的<TCP/UDP socket 调试工具>(如下图1)作为数据收发的客户端。
图1
通过这种方法测试得出:如果客户端是直接点击客户端的断开按钮(如下图2),服务器端就直接退出,并且