【C++ linux】SIGPIPE信号在网络通信程序导致程序异常中断

在网络通信程序中,当尝试向已关闭的socket发送数据时,会触发SIGPIPE信号导致进程终止。通常需要忽略此信号,以防止程序异常中断。测试显示,忽略SIGPIPE信号后,程序能够在socket关闭时正常结束,避免异常退出,并能正确处理未完成的发送操作。
摘要由CSDN通过智能技术生成

在网络通信的程序中,忽略SIGPIPE信号,防止程序异常退出


具体原因:

如果send到一个已关闭的socket上,内核就会发出SIGPIPE信号。这个信号  
的缺省处理方法是终止进程,大多数时候这都不是我们期望的。也没有必要重新定义这
个信号的处理方法,大多数情况是直接屏蔽它,让send函数返回错误。


测试程序:

客户端 

服务端关闭socket前后 都向服务端发送报文 

/*
 * 程序名:demo01.cpp,此程序用于演示socket通讯的客户端的SIGPIPE信号。
 * 作者:毛毛。
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
#include <signal.h>

class tmp
{
public:
    tmp();
    ~tmp();
};

int main(int argc,char *argv[])
{
  if (argc!=3)
  {
    printf("Using:./demo01 ip port\nExample:./demo01 127.0.0.1 5005\n\n"); return -1;
  }

  tmp tmpa;

  // 第1步:创建客户端的socket。
  int sockfd;
  if ( (sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); return -1; }
 
  // 第2步:向服务器发起连接请求。
  struct hostent* h;
  if ( (h = gethostbyname(argv[1])) == 0 )   // 指定服务端的ip地址。
  { printf("gethostbyname failed.\n"); close(sockfd); return -1; }
  struct sockaddr_i
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值