用进程和线程完成TCP进行通信操作及广播和组播的通信
进程
代码
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#include <sys/wait.h>#define PORT 8888#define IP "192.168.124.62" #define ERR_MSG(msg) do{\fprintf(stderr,"line=%d",__LINE__);\perror(msg);\}while(0)void handler(int sig){while(waitpid(-1,NULL,WNOHANG)>0);}int main(int argc, const char *argv[]){//创建套接字int fd = socket(AF_INET,SOCK_STREAM,0);if(fd<0){ERR_MSG("socket");return -1;}printf("-流式套接字\n");//捕获17号信息SIGCHLDif(signal(17,handler) == SIG_ERR){ERR_MSG("signal");return -1;}//允许端口号重复使用int reuse = 1;if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}printf("端口允许快速重用\n");//创建一个地址信息结构体,bind绑定需要用到struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);//绑定ip和端口if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("绑定成功\n");//将套接字设置为监听状态if(listen(fd,128)<0){ERR_MSG("listen");return -1;}printf("监听成功\n");int newfd;pid_t pid;struct sockaddr_in cin;socklen_t socklen = sizeof(cin);while(1){//获取连接成功的套接字,用于阻塞等待连接newfd = accept(fd,(struct sockaddr*)&cin,&socklen);if(newfd <0){ERR_MSG("accept");return -1;}printf("[%s:%d]客户端连接成功%d\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd);pid = fork();if(pid == 0){close(fd);//接收与发送char buf[128];ssize_t size;while(1){//接收//bzero(buf,sizeof(buf));//清空数组内容// size = read(newfd,buf,sizeof(buf));size = recv(newfd,buf,sizeof(buf),0);// size = recvfrom(newfd,buf,sizeof(buf),0,NULL,NULL);if(size<0){ERR_MSG("recv");return -1;}else if(size==0){printf("[%s:%d]客户端下线\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));break;}printf("[%s:%d]接收成功newfd=%d:%s\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd,buf);//发送printf("服务器回复>>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = '\0';if(send(newfd,buf,sizeof(buf),0)<0){ERR_MSG("send");break;}printf("发送成功\n");}close(newfd);exit(0);}close(newfd);}close(fd);return 0;}
运行结果图:

线程
代码:
1 #include <stdio.h>2 #include <sys/types.h>3 #include <sys/socket.h>4 #include <netinet/in.h>5 #include <arpa/inet.h>6 #include <string.h>7 #include <unistd.h>8 #include <stdlib.h>9 #include <signal.h>10 #include <sys/wait.h>11 #include <pthread.h>12 13 #define PORT 888814 #define IP "192.168.124.62"15 #define ERR_MSG(msg) do{\16 fprintf(stderr,"line=%d",__LINE__);\17 perror(msg);\18 }while(0)19 20 struct msg21 {22 int newfd;23 struct sockaddr_in cin;24 };25 void* huidiaolist(void* arg);26 int main(int argc, const char *argv[])27 {28 //创建套接字29 int fd = socket(AF_INET,SOCK_STREAM,0);30 if(fd<0)31 {32 ERR_MSG("socket");33 return -1;34 }35 printf("-流式套接字\n");36 //允许端口号重复使用37 int reuse = 1;38 if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)39 {40 ERR_MSG("setsockopt");41 return -1;42 }43 printf("端口允许快速重用\n");44 //创建一个地址信息结构体,bind绑定需要用到45 struct sockaddr_in sin;46 sin.sin_family = AF_INET;47 sin.sin_port = htons(PORT);48 sin.sin_addr.s_addr = inet_addr(IP);49 //绑定ip和端口50 if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0)51 {52 ERR_MSG("bind");53 return -1;54 }55 printf("绑定成功\n");56 57 //将套接字设置为监听状态58 if(listen(fd,128)<0)59 {60 ERR_MSG("listen");61 return -1;62 }63 printf("监听成功\n");64 65 int newfd;66 pid_t pid;67 struct sockaddr_in cin;68 socklen_t socklen = sizeof(cin);69 70 pthread_t tid;71 struct msg clinfo;72 while(1)73 {74 //获取连接成功的套接字,用于阻塞等待连接75 newfd = accept(fd,(struct sockaddr*)&cin,&socklen);76 if(newfd <0)77 {78 ERR_MSG("accept");79 return -1;80 }81 printf("[%s:%d]客户端连接成功%d\n",\82 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd);83 84 clinfo.newfd = newfd;85 clinfo.cin = cin;86 if(pthread_create(&tid,NULL,huidiaolist,(void*)&clinfo)!=0)87 {88 fprintf(stderr,"line=%d",__LINE__);89 break;90 }91 pthread_detach(tid);92 }93 close(fd);94 95 return 0;96 }97 98 void* huidiaolist(void* arg)99 {
100 //接收与发送
101 int newfd = ((struct msg*)arg)->newfd;
102 struct sockaddr_in cin = ((struct msg*)arg)->cin;
103
104 char buf[128];
105 ssize_t size;
106 while(1)
107 {
108 //接收
109 //
110 bzero(buf,sizeof(buf));//清空数组内容
111 // size = read(newfd,buf,sizeof(buf));
112 size = recv(newfd,buf,sizeof(buf),0);
113 // size = recvfrom(newfd,buf,sizeof(buf),0,NULL,NULL);
114 if(size<0)
115 {
116 ERR_MSG("recv");
117 break;
118 }else if(size==0)
119 {
120 printf("[%s:%d]客户端下线\n",\
121 inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
122 break;
123 }
124 printf("[%s:%d]接收成功newfd=%d:%s\n",\
125 inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);
126
127
128 //发送
129 strcpy(buf,"回复");
130 if(send(newfd,buf,sizeof(buf),0)<0)
131 {
132 ERR_MSG("send");
133 break;
134 }
135 printf("发送成功\n");
136 }
137 close(newfd);
138 pthread_exit(NULL);
结果图:

广播
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 6667
#define IP "192.168.124.255"
#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d\n",__LINE__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(fd<0){ERR_MSG("scoket");return -1;}printf("创建流式套接字成功cd=%d\n",fd);//允许端口被重int reuse = 1;if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}printf("允许端口被重复使用\n");//允许广播if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}//绑定服务器地址信息,必须绑定struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr= inet_addr(IP);//绑定IP及端口号if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("绑定成功\n");char arr[128];struct sockaddr_in cin;socklen_t addrlen = sizeof(arr);while(1){//发送数据printf("请输入数据>>>>>");fgets(arr,sizeof(arr),stdin);arr[strlen(arr)-1] = '\0';if(sendto(fd,arr,sizeof(arr),0,\(struct sockaddr*)&sin,sizeof(sin))<0) {ERR_MSG("sendto");return -1;}printf("发送成功\n");bzero(arr,sizeof(arr));}close(fd);return 0;
}
组播
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 6667
#define IP "224.1.2.3"
#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d\n",__LINE__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(fd<0){ERR_MSG("scoket");return -1; }printf("创建流式套接字成功cd=%d\n",fd);//允许端口被重int reuse = 1;if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}printf("允许端口被重复使用\n");//允许广播if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}//绑定服务器地址信息,必须绑定struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr= inet_addr(IP);//绑定IP及端口号if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("绑定成功\n");char arr[128];struct sockaddr_in cin;socklen_t addrlen = sizeof(arr);while(1){//发送数据 printf("请输入数据>>>>>");fgets(arr,sizeof(arr),stdin);arr[strlen(arr)-1] = '\0';if(sendto(fd,arr,sizeof(arr),0,\(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}printf("发送成功\n");bzero(arr,sizeof(arr));}close(fd);return 0;
}
相关文章:
用进程和线程完成TCP进行通信操作及广播和组播的通信
进程 代码 #include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#includ…...
浅谈Tomcat
文章目录 一、什么是Tomcat?二、Tomcat的下载安装三、使用tomcat访问资源 一、什么是Tomcat? Tomcat 就是一个 HTTP 服务器。 前面我们聊了HTTP服务器,像我们在网页输入URL,其实就是在给人家的HTTP服务器发送请求,既…...
C++精解【7】
文章目录 eigen矩阵初始化多维矩阵矩阵和向量size固定大小or 动态大小Matrix类六个模板参数初始化向量元素类型 参考文献 eigen 矩阵初始化 多维矩阵 数组 MatrixXi a { // construct a 2x2 matrix{1, 2}, // first row{3, 4} // second row }; Matrix<do…...
堆箱子00
题目链接 堆箱子 题目描述 注意点 将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子 解答思路 初始想到深度优先遍历,最后超时了参照题解使用动态规划,先将盒子从小到大进行排序,dp[i]存储的是到第i个箱子时堆箱…...
Linux 命令:iftop
1. 写在前面 本文主要介绍 Linux iftop(Interface TOP) 命令:iftop 是一款小巧、免费且功能强大的网卡实时流量监控工具。监控指定网卡的实时流量、端口连接信息、反向解析 IP 等,还可以精确显示本机网络流量及网络内各主机和本机…...
web学习笔记(六十九)vue2
目录 1. vue2创建脚手架项目 2.vue2如何关闭eslint 1. vue2创建脚手架项目 (1)在cmd窗口输入npm install -g vue/cli命令行,快速搭建脚手架。 (2) 创建vue2项目 (3) 选择配置项目,…...
JavaScript全解:从基础到高级,掌握每一个知识点
引言: JavaScript是一种广泛使用的脚本语言,主要用于Web浏览器,但近年来也扩展到了服务器端(Node.js)和其他领域。它允许开发者创建交互式的网页,处理数据,控制用户界面,甚至构建完…...
RabbitMQ的Direct交换机
Direct交换机 BindingKey 在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下: 队列与交换机的绑定&a…...
2024.6.26 待学习知识点
OOALV https://www.cnblogs.com/BruceKing/p/11447499.html " 取工单的组件 lt_aufnr CORRESPONDING #( lt_out MAPPING aufnr aufnr EXCEPT * ). ABAP POPUP_TO_CONFIRM 弹出框函数 CLASS-EVENTS CLASS-METHODS main. CLASS-METHODS raise_event_EXIT_COMMAND IMPOR…...
【LeetCode】每日一题:相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&am…...
6.26.1 残差卷积变压器编码器的混合工作流程用于数字x线乳房x光片乳腺癌分类
基于残差卷积网络和多层感知器变压器编码器(MLP)的优势,提出了一种新型的混合深度学习乳腺病变计算机辅助诊断(CAD)系统。利用骨干残差深度学习网络创建深度特征,利用Transformer根据自注意力机制对乳腺癌进行分类。所提出的CAD系统具有识别两种情况乳腺…...
[leetcode]avoid-flood-in-the-city 避免洪水泛滥
. - 力扣(LeetCode) class Solution { public:vector<int> avoidFlood(vector<int>& rains) {vector<int> ans(rains.size(), 1);set<int> st;unordered_map<int, int> mp;for (int i 0; i < rains.size(); i) {i…...
Pytorch基础
文章目录 零、tensorboard0.1基本使用案例 一、数据结构:Tensor1.1数据类型1.2Tensor的创建方式1.3张量的基本运算1.4张量的属性 二、数据集加载器DataLoaders2.0前置知识2.0.1torch.scatter()、torch.scatter_() 2.1官方案例2.1.1从TorchVision加载数据集2.1.2迭代…...
嵌入技术Embedding
嵌入(Embedding)是一种将高维数据映射到低维空间的技术,广泛应用于自然语言处理(NLP)、计算机视觉和推荐系统等领域。嵌入技术的核心思想是将复杂的数据表示为低维向量,使其在这个低维空间中保留尽可能多的…...
Pandas中的数据转换[细节]
今天我们看一下Pandas中的数据转换,话不多说直接开始🎇 目录 一、⭐️apply函数应用 apply是一个自由度很高的函数 对于Series,它可以迭代每一列的值操作: 二、⭐️矢量化字符串 为什么要用str属性 替换和分割 提取子串 …...
vue2面试题——路由
1. 路由的模式和区别 路由的模式:history,hash 区别: 1. 表象不同 history路由:以/为结尾,localhost:8080——>localhost:8080/about hash路由:会多个#,localhost:8080/#/——>localhost:…...
【AI应用探讨】—朴素贝叶斯应用场景
目录 文本分类 推荐系统 信息检索 生物信息学 金融领域 医疗诊断 其他领域 文本分类 垃圾邮件过滤:朴素贝叶斯被广泛用于垃圾邮件过滤任务,通过邮件中的文本内容来识别是否为垃圾邮件。例如,它可以基于邮件中出现的单词或短语的概率来…...
使用matlab的大坑,复数向量转置!!!!!变量区“转置变量“功能(共轭转置)、矩阵转置(默认也是共轭转置)、点转置
近期用verilog去做FFT相关的项目,需要用到matlab进行仿真然后和verilog出来的结果来做对比,然后计算误差。近期使用matlab犯了一个错误,极大的拖慢了项目进展,给我人都整emo了,因为怎么做仿真结果都不对,还…...
昇思25天学习打卡营第8天|保存与加载
1. 学习内容复盘 1.1 保存与加载 上一章节主要介绍了如何调整超参数,并进行网络模型训练。在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,本章…...
【vueUse库Animation模块各函数简介及使用方法】
vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseAnimation函数1. useInter…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
