linux C++ 网络通信 -- Broken pipe,接收端突然断开,发送没收到,仍然发送消息,会导致进程崩溃

最近做C++ 服务器时,两个服务器之间通信时,一个是logserver , 一个是gameserver ,gameserver 定时向logserver 发心跳包(也就是 logserver 相当于server , gameserver 相当于client ),突然断开logserver ,就相当于服务器崩溃了,客户端不知道,仍旧照常发数据,但是相应的连接不存在,gameserver 就会报 Broken pipe 的错误,之后,进程也崩溃了。


当然进程崩溃,是做服务器最不愿意看到的事情,所以,尽管logserver 断开了,gameserver 还得正常跑,不能崩掉,网上查了一下,找到了解决办法,记录下


加一个信号处理函数,发送信息时是个无效的连接,就会触发SIGPIPE 信号,默认的是关闭进程,所以 自己再写信号处理函数,不让进程关闭就没事

signal(SIGPIPE, handle_test);


对应的信号处理函数

static void handle_test(int sig)
{
	close(iLogserverFd);
	cout << "logserver has close ===>" << endl;
	iLogserverFd = 0;
}

iLogserverFd 就是与logserver 对应的连接


再发送消息时,如果判断 iLogserverFd = 0    就不会再发送,这样就达到了目的

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值