在网络通信的程序中,忽略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