Linux下Socket编程利用多进程实现一台服务器与多台客户端并发通信

news2024/12/25 12:15:50

文章目录

  • 前言
  • 一、服务器 server
  • 二、客户端 client
  • 三、并发通信演示
  • 四、程序源码


前言

前些日子同“ Linux应用编程 ”专栏中发布过的TCP及UDP在Linux或Windows下的通信都为单进程下的Socket编程,若还存在一些套接字相关函数模糊不清,读者可移步“Socket编程下tcp通信”和“Socket编程下udp通信”重温学习。
本篇则是对以上俩篇的一个简单提升运用,或者说是对以后多线程/进程工作的简单示例。

相关知识运用:

  • PF_INET 和 AF_INET 的区别:在Windows中,AF_INET与PF_INET完全一样,而在Unix/Linux系统中,在不同的版本中这两者有微小差别。对于BSD,是AF,对于POSIX是PF。
  • bzero函数与memset函数: 俩函数功能为 置字节字符串s的前n个字节为零且包括‘\0’,但bzero已被标记为遗留函数,这里推荐使用memset函数。
  • fork()函数: 返回值为0时为子进程,返回值大于0时为父进程,返回值为其他数时为创建失败。
  • atoi函数: 把字符串转换成整型数的一个函数,int atoi(const char *nptr)函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等,如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。且该函数要求被转换的字符串是按十进制数理解的,atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1。
  • htons: 是将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为高位字节存放在内存的低地址处。

一、服务器 server

①创建套接字描述符

//创建一个socket文件,也就是打开一个网络通讯端口,类型是IPV4(PF_INET)+TCP(SOCK_STREAM)
int server_socket=socket(PF_INET,SOCK_STREAM,0);

②创建服务器地址结构

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr)); 
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[1]));
server_addr.sin_addr.s_addr = INADDR_ANY;

③绑定套接字

bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));

④监听套接字

listen(server_socket,10);

⑤多进程连接

client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size);
int pid=fork();   //创建子进程
if(pid==0){       //子进程
	struct sockaddr_in client_in_addr;   // 创建临时客户端地址结构体用于存放开始accept到的客户端数据
	client_in_addr.sin_addr.s_addr=client_addr.sin_addr.s_addr;
	client_in_addr.sin_port=client_addr.sin_port;
	recv_len = recv(client_socket, buf, sizeof(buf), 0);  //接收客户端数据存入缓冲区buf中
}
else if(pid>0){    //父进程
	close(client_socket);
}
else{       //创建子进程失败,直接退出
	exit(-1);
}

二、客户端 client

①创建网络通信套接字描述符

int client_socket=socket(AF_INET,SOCK_STREAM,0);

②创建服务器的地址结构体

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr)); 
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(atoi(argv[2]));
server_addr.sin_addr.s_addr=inet_addr(argv[1]);

③连接服务器

connect(client_socket,(struct sockaddr*)&server_addr,sizeof(server_addr));

④收发数据

write(client_socket, buf, strlen(buf));   //向服务器发送缓冲区buf中的数据
read(client_socket, message, sizeof(message));   //读取服务器发过来的数据并存入缓冲区message中

三、并发通信演示

在这里插入图片描述

四、程序源码

若需程序源码可留言邮箱至评论区或直接私信 即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

整合K8s+SpringBoot+gRpc

本文使用K8s当做服务注册与发现、配置管理&#xff0c;使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…

Python3 模块实例及演示

在前面的几个章节中我们基本上是用 python 解释器来编程&#xff0c;如果从 Python 解释器退出再进入&#xff0c;那么定义的所有的方法和变量就都消失。 为此 Python 提供了1个办法&#xff0c;把这些定义存放在文件中&#xff0c;为一些脚本或者交互式的解释器实例使用&…

[oeasy]python0085_ASCII之父_Bemer_COBOL_数据交换网络

编码进化 回忆上次内容 上次 回顾了 字符编码的 进化过程 IBM 在数字化过程中 作用 非常大IBM 的 BCDIC 有 黑历史 &#x1f604; 6-bit的 BCDIC 直接进化成 8-bit的 EBCDIC补全了 小写字母 和 控制字符 在ibm就是信息产业的年代 ibm的标准 怎么最终 没有成为 行业的标准 呢…

OCR标注方法

虽然说标注工作不是由算法工程师负责的&#xff0c;但是如何标注&#xff0c;标注要求却是由算法工程师指导标注人员去实施的&#xff0c;如果标注工作人员标注的数据有问题&#xff0c;就会出现模型训练不收敛的问题&#xff0c;导致很多问题的出现&#xff0c;所以标注要求很…

MySql调优基础知识

MySql调优 调优金字塔 系统设计&#xff1a;数据不适合放入mysql&#xff0c;es、MQ、Redis、读写分离。 mysql调优&#xff1a;主要是索引且要熟悉业务。 mysql导致慢查询的原因是因为数据太多了。 1.sql查询 1.1尽量使用覆盖索引 1.2数据表结构&#xff0c;统计汇总&am…

普通单双面板的生产工艺流程之图形转移,华秋一文告诉你

衔接上文&#xff0c;继续为朋友们分享普通单双面板的生产工艺流程。 如图&#xff0c;第五道主流程为图形转移。 图形转移的目的为&#xff1a; 利用光化学原理&#xff0c;将图形线路的形状转移到印制板上&#xff0c;再利用化学原理&#xff0c;将图形线路在印制板上制作出…

Tomcat- AJP协议文件读取/命令执行漏洞(CVE-2020-1938 / CNVD-2020-10487)

CVE-2020-1938 1.概述1.1 tomcat概述1.2 gostcat概述 - 漏洞概述2. 漏洞成因2.1 前置基础2.1.1 Tomcat Connector(连接器)2.1.2 Servlet(服务程序)2.1.3 Tomcat内部处理请求流程2.2 源码追踪分析两个利用方案的执行流程2.2.1 获取利用poc2.2.2 文件读取漏洞关键点1&#xff1a;…

CSDN城市开发者联盟、C友会期待你的加入

文章目录&#x1f31f; 课前小差&#x1f31f; chatGPT&#x1f31f; CSDN中的持续学习&#x1f31f; 23年原力计划&#x1f31f; C友会、CDC&#x1f31f; 如何关联本地的开发者&#xff1f;&#x1f31f; 写在最后&#x1f31f; 课前小差 哈喽&#xff0c;大家好&#xff0c…

2月datawhale组队学习:大数据

文章目录一、大数据概述二、 Hadoop2.1 Hadoop概述2.2 su:Authentication failure2.3 使用sudo命令报错xxx is not in the sudoers file. This incident will be reported.2.4 创建用户datawhale&#xff0c;安装java8&#xff1a;2.5 安装单机版Hadoop2.5.1 安装Hadoop2.5.2 修…

excel报表技巧:几个关于汇报演示方面的小功能

年终了&#xff0c;总结汇报避免不了。如果你的PPT还不够好&#xff0c;那就直接用Excel做汇报吧~这里有5条小技巧&#xff0c;可以帮助你最高效地展示自己的成绩报表&#xff01;想象一下&#xff0c;用SHIFTCTRLF1全屏显示你的工作表&#xff0c;配合上CtrlPageDown进行工作表…

WMS系统解决方案,数据从“人工采集”转为“自动采集”

今年以来&#xff0c;新冠疫情危机促使国内企业重新审视自我发展&#xff0c;加速了行业转型的步伐。很多制造企业放慢了规模扩张的脚步&#xff0c;应需而变&#xff0c;从规模速度型向质量效率型转型升级。纵观市场现状&#xff0c;很多制造企业面临产能过剩、成本上升、库存…

CHAPTER 4 监控全网服务器

监控全网服务器4.1 需求说明4.2 规划方案4.2.1 api接口使用&#xff08;curl&#xff09;4.3 具体实施规划4.3.1 硬件、系统、网络监控4.3.2 应用服务监控4.3.3 监控服务通用方法4.4 实施全网监控4.4.1 使用自动发现规则4.4.2 监控备份服务器1. 添加模板2. 添加应用集3. 添加监…

【观察】Solidigm P44 Pro SSD评测:原厂品质+软硬兼施=性能怪兽

众所周知&#xff0c;目前SSD&#xff08;固态硬盘&#xff09;已取代HDD&#xff08;机械硬盘&#xff09;成为电脑中常见的存储设备&#xff0c;特别是在技术创新的持续推动下&#xff0c;如今SSD的速度和效率都在不断地提高&#xff0c;从SATA2 3GB发展到SATA3 6GB&#xff…

计算机组成原理学习笔记:循环冗余校验码

循环冗余校验码 CRC 码 循环冗余校验码 (cyclic redundancy Check, CRC) 十进制除法 从熟悉的十进制出发&#xff0c;假设现在你要给另一个人传送882这样的一个10进制数据&#xff0c;为了防止传送数据的过程中某一个数据发生错误你可以和你的另一个小伙伴约定一个除数&…

英文论文(sci)解读复现【NO.5】让RepVGG再次变得更强大:一种量化感知方法

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的SCI论文&am…

2023年可见光通信(LiFi)研究新进展

可见光无线通信Light Fidelity&#xff08;LiFi&#xff09;又称“光保真技术”&#xff0c;是一种利用可见光进行数据传输的全新无线传输技术。LiFi是一种以半导体光源作为信号发射源&#xff0c;利用无需授权的自由光谱实现无线连接的新型无线通信技术&#xff0c;支持高密度…

内网渗透(三十六)之横向移动篇-Password Spraying密码喷洒攻击和域内用户枚举横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

【原创】java+swing+mysql宿舍报修管理系统设计与实现

本文主要想利用javaswingmysql等开发技术设计一个高校宿舍报修管理系统&#xff0c;方便广大学生对宿舍中损坏的物品进行报修处理&#xff0c;提高报修效率。 功能分析&#xff1a; 宿舍报修管理系统的使用角色&#xff0c;一般分为管理员和学生&#xff0c;管理员主要进行学…

深入理解顺序io和随机io(全网最详细篇)

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

汽车如何实现制动

汽车如何实现制动 汽车如何实现制动 难点答疑&#xff1a;汽车刹车时&#xff0c;四个车轮是如何制动的&#xff1f;制动机理是什么&#xff1f; 第一步&#xff1a;驾驶员踩下制动踏板&#xff0c;推动制动主缸 第二步&#xff1a;制动主缸将制动液的压力通过制动管道传递到四…