系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 服务端代码
  • 客户端代码

前言

利用socket实现服务器与客户端之间的网络通讯
当子进程结束时会产生SIGCHLD信号,利用该信号实现进程回收


服务端代码

#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <wait.h>
#include <errno.h>
#include <signal.h>
#include <arpa/inet.h>void recyleChild(int arg)
{while (1){int ret = waitpid(-1, NULL, WNOHANG);if (ret == -1){break;}else if (ret == 0){break;}else if (ret > 0){printf("子进程%d被回收了\n", ret);}}
}int main()
{struct sigaction act;act.sa_flags = 0;sigemptyset(&act.sa_mask);act.sa_handler = recyleChild;sigaction(SIGCHLD, &act, NULL);int lfd = socket(PF_INET, SOCK_STREAM, 0);if (lfd == -1){perror("socket");exit(-1);}struct sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(9999);saddr.sin_addr.s_addr = INADDR_ANY;int ret = bind(lfd, (struct sockaddr *)&saddr, sizeof(saddr));if (ret == -1){perror("bind");exit(-1);}ret = listen(lfd, 128);if (ret == -1){perror("listen");exit(-1);}while (1){struct sockaddr_in cliaddr;int len = sizeof(cliaddr);int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len);if (cfd == -1){if (errno == EINTR){continue;}perror("accept");exit(-1);}pid_t pid = fork();if (pid == 0){char cliIP[16];inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, cliIP, sizeof(cliIP));unsigned short cliPort = ntohs(cliaddr.sin_port);printf("client ip is: %s, port is %d\n", cliIP, cliPort);char recvBuf[1024];while (1){int len = read(cfd, &recvBuf, sizeof(recvBuf));if (len == -1){perror("read");exit(-1);}else if (len >0){printf("recv client: %s\n", recvBuf);}else if (len == 0){printf("client closed...\n");break;}write(cfd, recvBuf, strlen(recvBuf)+1);}close(cfd);exit(0);}}close(lfd);
}

客户端代码

#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <wait.h>
#include <errno.h>
#include <signal.h>
#include <arpa/inet.h>int main()
{int fd = socket(AF_INET, SOCK_STREAM, 0);if (fd == -1){perror("socket");exit(-1);}struct sockaddr_in serveraddr;serveraddr.sin_family = AF_INET;inet_pton(AF_INET, "192.168.110.132", &serveraddr.sin_addr.s_addr);serveraddr.sin_port = htons(9999);int ret = connect(fd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));if (ret == -1){perror("connect");exit(-1);}char recvBuf[1024];int i = 0;while (1){scanf("%s", recvBuf);// sprintf(recvBuf, "data: %d\n", i++);write(fd, recvBuf, strlen(recvBuf)+1);int len = read(fd, recvBuf, sizeof(recvBuf));if (len == -1){perror("read");exit(-1);}else if (len > 0){printf("recv server: %s\n", recvBuf);}else if (len == 0){printf("server closed...\n");break;}// sleep(1);}close(fd);}

Linux网络编程之实现服务器与客户端之间的通讯相关推荐

  1. Linux网络编程——tcp并发服务器(poll实现)

    https://blog.csdn.net/lianghe_work/article/details/46535859 想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程--I/ ...

  2. Linux网络编程 - 基于UDP的服务器端/客户端

    一 理解UDP 1.0 UDP协议简介 UDP(User Datagram Protocol,用户数据报协议) [RFC 768] UDP协议的数据传输单元叫 UDP用户数据报,而TCP协议的数据传输 ...

  3. C# Socket网络编程入门(服务器与客户端通信,客户端与客户端通信)

    WebSocket全双工通讯链接,用于前台和后台自由发送信息 一.效果展示: 效果描述: 1.服务器充当管理员,给所有人发送信息,除服务器以外其他人都能接受到. 2.其他用户发送信息除自己以外其他用户 ...

  4. 【Java 网络编程】UDP 服务器 与 客户端持续交互 案例

    文章目录 I UDP 交互原理 II UDP 服务器端代码示例 III UDP 客户端代码示例 IV 服务器 客户端 运行结果 I UDP 交互原理 1. UDP 单播传输流程 : A 给 B 发送数 ...

  5. Linux网络编程——tcp并发服务器(epoll实现)

    https://blog.csdn.net/lianghe_work/article/details/46551871 通过epoll实现tcp并发回执服务器(客户端给服务器发啥,服务器就给客户端回啥 ...

  6. Linux网络编程——连接和面向连接的协议之间没有区别

    网络编程中最重要的概念就是连接取向(connection-oriented)和无连接(connectionless)协议.虽然本质.两者之间的区别是不难理解,编程的人来说,却是个非常easy混淆的问题 ...

  7. 【Linux网络编程】并发服务器的三种实现模型

    服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器. 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器(多 ...

  8. linux网络编程之并发服务器的三种实现模型 (超级经典)

    转载 : http://blog.csdn.net/tennysonsky/article/details/45671215 服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器 ...

  9. Linux网络编程——tcp并发服务器(多进程)

    https://blog.csdn.net/lianghe_work/article/details/46503895 一.tcp并发服务器概述 一个好的服务器,一般都是并发服务器(同一时刻可以响应多 ...

最新文章

  1. IDEA的CPU占用率高问题解决方法
  2. jsp程序带mysql数据库_【web开发】:JSP连接Mysql数据库(非常详细,代码一看就懂)...
  3. java字节码_好的,每个接触Java字节码的人
  4. linux命令行学习游戏,如何在Linux命令行中下载GOG游戏
  5. “图片变幻显示控件”发布
  6. 各种波形文件(wlf/vcd/fsdb/shm/vpd)的区别及生成方法(转)
  7. 产品结构图、功能结构图、信息结构图,区别在这里
  8. aes-gcm模式前端加解密(html页面 js)——使用node-forge库
  9. taobao滑动验证码解决方法
  10. Kinect(XBOX360)相机在ROS下标定
  11. LeetCode题解系列--309. Best Time to Buy and Sell Stock with Cooldown
  12. LeetCode||整数转罗马数字(Java)
  13. component动态组件
  14. 数学与计算机专业的论文,数学与计算机关系论文.doc
  15. linux usb子系统.框架
  16. 错误记录一:线程通信时抛出Exception in thread “Thread-0” java.lang.IllegalMonitorStateException异常
  17. DHT11 模块的使用
  18. VScode 插件live preview无法显示背景图片/图片
  19. 网关冗余和负载平衡简介
  20. 查询所有科目成绩都大于90分的学生姓名

热门文章

  1. 理想中的Web3信誉体系:如何在Web2基础上升级?
  2. 新手机第一次充电,怎么充电对电池好?
  3. CodeBlocks 安装教程(百度网盘)
  4. asp.net早餐订购系统
  5. 中国棕榈仁油和椰子油基天然脂肪酸市场趋势报告、技术动态创新及市场预测
  6. 花生壳内网穿透+https+tomcat不能进行网页访问(二、跨域访问的问题)
  7. 单反数码相机存储卡数据恢复
  8. simplicity commander的使用方法
  9. 利用POST重启路由器,一直无法实现,求帮助
  10. Python使用Turtle画玻利维亚国旗