服务端代码:

#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>#define SIN_PORT 9999
#define BUFLEN 256void str_echo(int fd);void sig_child(int signo)
{pid_t pid;int stat;while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) {printf("pid %d terminated\n", pid);}}int main(int argc, char **argv)
{int listenfd, connfd;pid_t child;struct sockaddr_in servaddr;char buf[BUFLEN];time_t ticks;listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd < 0) {printf("socket error :%s\n", strerror(errno));        return -1;}servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SIN_PORT);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);signal(SIGCHLD, sig_child);if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {printf("bind error:%s\n", strerror(errno));close(listenfd);return -1;}if (listen(listenfd, 3) < 0) {printf("listen error:%s\n", strerror(errno));close(listenfd);return -1;}struct sockaddr_in clientaddr;int len;for (;;) {len = sizeof(clientaddr);connfd = accept(listenfd, (struct sockaddr*)&clientaddr, &len);if (connfd < 0) {printf("accept error:%s\n", strerror(errno));close(listenfd);return -1;}if ((child = fork()) == 0) {close(listenfd);str_echo(connfd);return 0;}/*printf("connection from %s, port:%d\n", inet_ntop(AF_INET, &clientaddr.sin_addr, buf, sizeof(buf)), htons(clientaddr.sin_port));ticks = time(NULL);snprintf(buf, sizeof(buf), "%.24s\r\n", ctime(&ticks));write(connfd, buf, strlen(buf));*/close(connfd);}return 0;
}size_t readn(int fd, void *ptr, size_t n)
{char *p = ptr;size_t nleft = n;size_t nread;while (nleft > 0) {if ((nread = read(fd, p, nleft)) < 0) {if (errno == EINTR) nread = 0;else return -1;} else if (nread == 0) break;nleft -= nread;p += nread;}return n - nleft;
}size_t readline(int fd, void *ptr, size_t maxsize)
{char *p = ptr;size_t rc, n;char c;for (n = 1; n < maxsize; n++) {
again:if ((rc = read(fd, &c, 1)) == 1) {*p++ = c;if (c == '\n') break;} else if (rc == 0) {if (n == 1) return 0;else break;} else {if (errno == EINTR) goto again;return -1;}}*p = 0;return n;
}size_t writen(int fd, void *ptr, size_t n)
{char *p = ptr;size_t nleft = n,  nwriten;while (nleft > 0) {if ((nwriten = write(fd, p, nleft)) <= 0) {if (errno == EINTR) nwriten = 0;else return -1;}p += nwriten;nleft -= nwriten;}return n;
}void str_echo(int fd)
{char recvline[BUFLEN];int n;for (;;) {if ((n = readline(fd, recvline, BUFLEN)) == 0) return;printf("received buf=%s", recvline);writen(fd, recvline, n);}
}

客户端代码:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>#define SIN_PORT 9999
#define BUF_LEN 256
#define max(a, b) ((a) > (b) ? (a) : (b))size_t readline(int fd, void *ptr, int maxsize)
{char *p = ptr;char c;int rc;int n;for (n = 1; n < maxsize; n++) {again:if ((rc = read(fd, &c, 1)) == 1) {*p++ = c;if (c == '\n') break; } else if (rc == 0) {if (n == 1) return 0;else break;}else {if (errno == EINTR) goto again;else return -1;}}*p = 0;return n;
}size_t readn(int fd, void *ptr, size_t n)
{char *p = ptr;int nleft = n;int nread;while (nleft > 0) {if ((nread = read(fd, p, nleft)) < 0) {if (errno == EINTR) nread = 0;else return -1;} else if (nread == 0) break;nleft -= nread;p += nread;}return n - nleft;
}size_t writen(int fd, void *ptr, size_t n)
{size_t nwriten;size_t nleft = n;char *p = ptr;while (nleft > 0) {if ((nwriten = write(fd, p, nleft)) <= 0) {if (errno == EINTR) nwriten = 0;else return -1;}nleft -= nwriten;p += nwriten;}return n;
}void str_cli(FILE *file, int fd)
{char recvline[BUF_LEN], sendline[BUF_LEN];int maxfdp1;/*fd_set fdset;int ret;FD_ZERO(&fdset);for(;;) {FD_SET(fileno(file), &fdset);FD_SET(fd, &fdset);maxfdp1 = max(fileno(file), fd) + 1;ret = select(maxfdp1, &fdset, NULL, NULL, NULL);   if (ret <= 0) {continue;}//printf("ret=%d\n", ret);if (FD_ISSET(fd, &fdset)) {if (readline(fd, recvline, BUF_LEN) == 0) {printf("readline error:%s\n", strerror(errno));return;}fputs(recvline, stdout);} if (FD_ISSET(fileno(file), &fdset)) {memset(sendline, 0x00, sizeof(sendline));if (fgets(sendline, BUF_LEN, file) == NULL) {printf("fgets error:%s\n", strerror(errno));return;}//printf("len=%d\n", strlen(sendline));writen(fd, sendline, strlen(sendline));}   }*/while (fgets(sendline, BUF_LEN, file) != NULL) {writen(fd, sendline, 1);sleep(1);writen(fd, sendline, strlen(sendline) - 1);if (readline(fd, recvline, BUF_LEN) == 0) {printf("readline error:%s\n", strerror(errno));return;}fputs(recvline, stdout);}
}int main(int argc, char** argv)
{struct sockaddr_in serveraddr;int sockfd;#ifndef ONLINE_JUDGE//freopen("6.4Client.c", "r", stdin);
#endifsockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {printf("socket error:%s\n", strerror(errno));return -1;}   serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(SIN_PORT);if (inet_pton(AF_INET, argv[1], &serveraddr.sin_addr) != 1) {printf("inet_pton error:%s\n", strerror(errno));close(sockfd);return -1;}if (connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) {printf("connect error:%s\n", strerror(errno));close(sockfd);return -1;}str_cli(stdin, sockfd);exit(0);}

当进程向一个接收了RST的套接口执行写操作时,会触发SIGPIPE信号,此信号的默认行为是终止进程

终止服务端子进程,在客户端输入字符串,客户端先向服务端发送一个字符,些时客户端收到RST,再向该套接口发送字符,些时会触发SIGPIPE信号

用echo $?查看程序输出结果,输出为141,SIGPIPE的信号值为13,即128 + 13

网络编程学习笔记(SIGPIPE信号触发)相关推荐

  1. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  2. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  3. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

  4. 网络编程中的 SIGPIPE 信号

    在网络编程中经常会遇到SIGPIPE信号,默认情况下这个信号会终止整个进程,当然你并不想让进程被SIGPIPE信号杀死.我们不禁会这样思考: 在什么场景下会产生SIGPIPE信号? 要怎样处理SIGP ...

  5. 15Java网络编程学习笔记

    Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...

  6. python网络编程学习笔记(二)

    python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...

  7. Linux网络编程学习笔记(TCP)

    文章目录 1 字节序 1.1 定义 1.2 字节序转换函数 2 Socket地址 2.1 通用socket地址(实际开发不使用) 2.2 专用socket地址 2 IP地址转换 3 TCP通信流程 3 ...

  8. 网络编程学习笔记--1.socket可读可写条件

    欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45788591 socket可读可写条件,经常做为面试题被问,因为 ...

  9. Linux网络编程学习笔记

    声明:1.未经过原作者许可,不可用于商业行为:2.本笔记仅用于知识学习,如有侵权,立即删除. 1.学习链接 黑马程序员-Linux网络编程:https://www.bilibili.com/video ...

最新文章

  1. 日本未来投资重点领域是物联网和人工智能应用
  2. “汇新杯”新兴科技+互联网创新大赛青年创客专项赛决赛
  3. [Spring cloud 一步步实现广告系统] 13. 索引服务编码实现
  4. 架构设计之依赖倒置、控制反转与依赖注入
  5. 杭电2012-素数判定(C)
  6. 简述arm linux内核启动流程,Linux内核启动过程和Bootloader(总述)
  7. firebug js版
  8. .NET与COM互操作系列
  9. 设计模式---状态模式(C++实现)
  10. RapidMiner 数据读写
  11. WinDriver 驱动安装err e000024b,err e000022f解决办法
  12. 如何去除Excel图表网格线?
  13. nan null underfined的区别
  14. 福州师范大学计算机专业导师简介,黄欣沂_福建师范大学研究生导师信息
  15. 携手绿凯智能,趣开门人脸识别门禁落地武汉光谷生物城
  16. 【機器學習2021】預測本頻道觀看人數 (下) - 深度學習基本概念簡介
  17. 【Python数学建模】SEIR传染病模型模型延伸-SEIDR模型(一),加入疫苗接种、政府管控、病毒变异等因素的影响
  18. JACS:截短侧耳素类抗生素Pleuromutilin的16步全合成
  19. Ardiuno智能电蚊拍
  20. 翻译python代码的软件_Linux环境下的Python翻译工具源码

热门文章

  1. Access数据库OleDbHelper
  2. C#操作XML小结_转载
  3. 5.串口操作之API篇 SetupComm GetCommState SetCommState
  4. 如何禁用双击窗体图标关闭窗体
  5. 解决无法连接到远程SqlServer 2005 Express服务器的问题
  6. python爬虫图片-python爬虫(爬取图片)
  7. python简单代码演示效果-10分钟教你用python 30行代码搞定简单手写识别!
  8. python3.6安装教程-Python 3.6.6安装教程(附安装包) | 我爱分享网
  9. python绘制随机数直方图-用matplotlib画直方图(histogram)
  10. 学会python爬虫怎么赚钱-自学python爬虫赚钱经历