客户-服务器程序错误Program received signal SIGPIPE, Broken pipe.

不能说的昵称 2017-05-01 07:34:42
先上代码:
//server
void newConnection(int sockfd,const InetAddress &addr)
{
::write(sockfd, "how are you?\n", 13); //简单地回复一句话
}

int main()
{
EventLoop loop;
InetAddress listenAddr(12345);
Acceptor acceptor(&loop, listenAddr);
acceptor.setConnectionCallback(newConnection); //listenfd可读(新连接)调用回调
acceptor.listen(); //Accept::listen调用listenfd的listen

//while(true)循环,Acceptor构造时讲listenfd放进loop的epoll结构中,
//本循环检测到listenfd可读(新连接)之后调用accept得到connfd,然后调用上面set的回调函数
loop.loop();
}


//client
int main(int argc, char **argv)
{
struct sockaddr_in addr;
bzero(&addr, sizeof addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
inet_pton(AF_INET, argv[1], &addr.sin_addr);

int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)); //连接server
char buf[256] = {'\0'};
read(sockfd, buf, sizeof(buf)); //接受msg
printf("Received: %s\n", buf);

close(sockfd);

return 0;
}


整个程序流程大致如下:
server启动之后Acceptor处于listen状态,然后client请求连接,连接成功server就调用回调newConnection发送“how are you”给client,client接受之后打印出来。

下面说下错误情况:
使用gdb调试发现每次在`::write(sockfd, "how are you?\n", 13);`就会接收到`SIGPIPE`然后程序死掉。

查了下**Program received signal SIGPIPE, Broken pipe.**的原因,都说是对无效(未连接或者连接断开)的sockfd进行write。但是我的程序运行到回调函数的write时也没有出现关闭连接的情况。(为了调试我还把所有代码中出现的close都注释掉)

另外,gdb调试到write的时候,我还用`ll /proc/pid/fd`查看了当前系统占用描述符,connfd也还存在着。

所以完全搞不懂为什么还会有SIGPIPE,求指教!
...全文
951 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanwan_1996 2017-08-09
  • 打赏
  • 举报
回复
我看了一下, 带码虽然没有什么问题。但是逻辑上应该是有为题的, 出现SIGPIPE信号的原因就是你的server在一直loop的时候,由于客户端不是一直处于loop状态,当客户端的fd关闭掉之后,服务端的fd也会有变化。当服务端在向客户端写的时发生SIGPIPE信号。因为TCP是全双工的,不可以读不代表不可以写。
9527 2017-05-02
  • 打赏
  • 举报
回复

signal(SIGPIPE, SIG_IGN);//忽略SIGPIPE信号,否则可能会造成程序异常退出,增加响应的handler也可以
或者

			status = send(hsock, (const char *)(sendbuf + sentbytes), sendlen - sentbytes,
			#ifdef _WIN32
			0
			#else
			MSG_DONTWAIT|
		#ifdef __APPLE__
			SO_NOSIGPIPE
		#else
			MSG_NOSIGNAL
		#endif
			#endif
			);

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧