SIGPIPE信号
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h> #include <string.h>
#include <assert.h>
#include <iostream> void signal_func(int sig)
{
int saved_errno = errno;
std::cout << "broken pipe!" << std::endl;
errno = saved_errno;
} int main()
{
struct sigaction sa;
sa.sa_handler = signal_func; sigemptyset(&sa.sa_mask);
sa.sa_flags = ; if (sigaction(SIGPIPE, &sa, NULL) < )
{
perror("cannot ignore SIGPIPE"); return -;
} int sockfd = socket(AF_INET, SOCK_STREAM, );
uint16_t port = ;
const char* ip= "192.168.16.105"; assert(sockfd > ); struct sockaddr_in sock_address;
memset(&sock_address, , sizeof(sock_address)); sock_address.sin_family = AF_INET;
sock_address.sin_port = htons();
inet_pton(AF_INET, ip, &(sock_address.sin_addr)); socklen_t sock_len = sizeof(sock_address); int ret = connect(sockfd, (sockaddr*)&sock_address, sock_len);
assert(ret != -); sleep(); // 在sleep之前断开服务端连接 char send_buff[] = "hello server!";
char recv_buff[] = {}; ssize_t ret_1 = send(sockfd, send_buff, strlen(send_buff), ); // 收到对端FIN后依然可以发送成功 不过对端会响应RST if (ret_1 < )
{
std::cout << strerror(errno) << std::endl;
}
else
{
std::cout << "send success!" << std::endl;
} ssize_t ret_2 = recv(sockfd, recv_buff, sizeof(recv_buff), ); if(ret_2 == )
{
std::cout << "remote close connection" << std::endl;
} ssize_t ret_3 = send(sockfd, send_buff, strlen(send_buff), ); // 这时再send会出错 并产生SIGPIPE信号 默认终止进程 if(ret_3 < )
{
if (errno == EPIPE)
{
std::cout << strerror(errno) << std::endl;
}
}
else
{
std::cout << "send success" << std::endl;
} return ;
}
SIGPIPE信号的更多相关文章
- Linux网络编程-SIGPIPE信号导致的程序退出问题
当客户端close关闭连接时,若server端接着发送数据,根据TCP协议的规定,server端会收到RST响应,当server端再次往客户端发送数据时,系统会发出一个SIGPIPE信号给server ...
- SIGPIPE信号详解
转自:http://blog.csdn.net/lmh12506/article/details/8457772 前一段面试的时候被问到项目中有没有处理SIGPIPE信号,怎么处理的?当时没有答出来, ...
- 忽略SIGPIPE信号
#include <stdlib.h> #include <sys/signal.h> void SetupSignal() { struct sigaction sa; // ...
- 关于SIGPIPE信号
对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.具体的分析可以结合TCP的"四次握手"关闭. TCP是全双工的信道, ...
- SIGPIPE信号解析
当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经 ...
- [转]SIGPIPE信号
我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试. 但是服务器总是莫名退出,没有core文件. 最后问题确定为, 对一个对端已经关闭的socket调 ...
- TCP/IP SIGPIPE信号
往一个已经接受FIN的套接中写是允许的,接受到FIN仅仅代表对方不再发送数据. 在收到RST段之后,如果在调用write就 会产生SIGPIPE信息,对于这个信号的处理我们通常 解决方法 signal ...
- 探讨socket引发SIGPIPE信号的问题
我写socket相关的程序也不是一天两天了,在我的记忆中,只要处理好recv(或read)的返回值中<0,==0,>0三种情况,程序便不会有什么问题.但最近在看公司的源代码时,发现代码中直 ...
- socket编程时SIGPIPE信号的处理
如果在write调用期间对方关闭连接,视时间顺序的不同有以下几种情况: 1. 刚好在write调用之前对方关闭: write返回失败,同时产生SIGPIPE. 2. write调用过程中对方关闭: 返 ...
随机推荐
- twobin博客样式
twobin博客样式—“蓝白之风” 自暑假以来,囫囵吞枣一般蒙头栽入前端自学中,且不说是否窥探其道,却不自觉中提高了对网页版面设计的要求,乃至挑剔.一个设计清爽美观的网页能让读者心旷神怡,甚至没有 ...
- json序列化NHibernate的实体
在使用nhibernate时,想将实体对象序列化成json字符串,然后打印在日志中. 序列化时会出现问题,应该是因为这个实体被hibernate管理的原因.具体原因没有分析. 解决方案:为实体创建一个 ...
- Forms Authentication in ASP.NET MVC 4
原文:Forms Authentication in ASP.NET MVC 4 Contents: Introduction Implement a custom membership provid ...
- linux 之 getopt_long()
文件 #include <getopt.h> 函数原型 int getopt_long(int argc, char * const argv[], const char *optstri ...
- linux网络编程(一)
一.概念介绍 网络程序分为服务端程序和客户端程序.服务端即提供服务的一方,客户端为请求服务的一方.但实际情况是有些程序的客户端.服务器端角色不是这么明显,即互为客户端和服务端. 我们编写网络程序时,一 ...
- .net下将富文本编辑器文本原样读入word文档
关键词:富文本编辑器 生成word 样式 为了解决标题中提出的问题,首选需要了解,在.net环境下读取数据库中的内容动态生成word至少有2种方式,[方式一]一种方式是在项目中添加引用,例如在“添 ...
- iOS7 Sprite Kit 学习
iOS7 Sprite Kit 学习 iOS 7有一个新功能 Sprite Kit 这个有点类似cocos2d 感觉用法都差不多.下面简单来介绍下Sprite Kit About Sprite Kit ...
- JavaScript –type
JavaScript –类型之我晕 每次写博我觉得取上恬当的题目比整篇行文都难,词量有限的情况下突然想到JavaScript拾遗应该会是一个非常文艺而夺目的博文题目,但我并没有急着使用,经验告诉我应该 ...
- jquery mobile扁平化设计样式--Jquery mobile Flat UI介绍
jquery mobile扁平化设计样式--Jquery mobile Flat UI介绍 这几天开发的web app使用了jquery mobile,jquery mobile自带的样式比较适合做企 ...
- [置顶] Oracle学习路线与方法
还没有整理好.... 1.学习路线 Oracle官方文档:2 Day DBA-->2 Day+Performance Tuning Guide--->Administrator's Gui ...