Socket 编程时候遇到的Broken pipe问题

本文介绍了一个UNIX SOCKET通信中出现broken pipe错误的问题及其解决办法。通过了解错误原因,作者采用信号处理机制来避免进程因接收到SIGPIPE信号而退出。文中还提供了具体的信号处理函数实现。

   昨天有个程序除了问题,调试的时候发现是在SOCKET通信的时候对方关闭连接的情况下出现broken pipe错误。在网上搜索了一番,别人解释原因是向已经关闭连接的SOCKET管道写入数据造成的,但是我的程序只是在对方关闭的时候继续RECV,难道 RECV也会向管道写入数据,这个问题以后再研究吧。

    知道了问题就好办了。UNIX的系统是采用信号机制向进程通知这种系统错误的,13 SIGPIPE 的默认操作是Exit,所以在程序里面写一个自己的信号处理函数,不让进程退出就OK。不过值得注意的是在截获一次信号以后,系统会把信号处理又恢复到默 认状态,所以需要再次设置。另外,对于多线程,我是在主线程里面做的信号处理,其他线程没有做,但是我理解信号是发给进程的,所以应该只要有一个线程处理 了信号就可以。

源码:

void InitSignal(void);
void handle_signal(int s) ;

/*初始化时及每次处理完时调用*/
void InitSignal(void)
{
signal(SIGPIPE,handle_signal);
}
/*信号处理函数*/
void handle_signal(int s)
{
InitSignal();
}

HTTP server running on port 80 send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe send: Broken pipe 在服务器终端报这个问题的同时,我使用边缘触发模式“(EPOLLET)epoll实现的服务器在测试的时候表现如下,这是为何呢?重点似乎在EPOLLET ,因为我改掉EPOLLET之后就在wrk -t8 -c500 -d10 http://192.168.64.10/测试中有数据了: wrk -t8 -c500 -d10 http://192.168.64.10/ Running 10s test @ http://192.168.64.10/ 8 threads and 500 connections Thread Stats Avg Stdev Max +/- Stdev Latency 0.00us 0.00us 0.00us -nan% Req/Sec 0.00 0.00 0.00 -nan% 0 requests in 10.04s, 0.00B read Requests/sec: 0.00 Transfer/sec: 0.00B 代码如下: int multiPlexIOEntry() { int server_sock = -1; int port = 80; struct sockaddr_in client_name; socklen_t client_name_len = sizeof(client_name); server_sock = startup(&port); printf("HTTP server running on port %d\n", port); int epoll_fd = epoll_create1(0); if (epoll_fd == -1) { perror("epoll_create1 failed"); exit(EXIT_FAILURE); } struct epoll_event ev; ev.events = EPOLLIN |EPOLLET ; ev.data.fd = server_sock; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_sock, &ev) == -1) { perror("epoll_ctl failed"); exit(EXIT_FAILURE); } struct epoll_event events[MAX_PROCESSES]; while (1) { int nfds = epoll_wait(epoll_fd, events, MAX_PROCESSES, -1); for (int i = 0; i < nfds; i++) { if (events[i].data.fd == server_sock) { int client_sock = accept(server_sock, (struct sockaddr *)&client_name, &client_name_len); if (client_sock == -1) { perror("accept failed"); continue; } ev.events = EPOLLIN; ev.data.fd = client_sock; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_sock, &ev) == -1) { perror("epoll_ctl add client failed"); close(client_sock); } } else { accept_request(events[i].data.fd); ev = events[i]; epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, &ev); } } } close(server_sock); close(epoll_fd); return 0; }
最新发布
08-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值