当前位置: 首页 > news >正文

用进程和线程完成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&#xff1f;二、Tomcat的下载安装三、使用tomcat访问资源 一、什么是Tomcat&#xff1f; Tomcat 就是一个 HTTP 服务器。 前面我们聊了HTTP服务器&#xff0c;像我们在网页输入URL&#xff0c;其实就是在给人家的HTTP服务器发送请求&#xff0c;既…...

C++精解【7】

文章目录 eigen矩阵初始化多维矩阵矩阵和向量size固定大小or 动态大小Matrix类六个模板参数初始化向量元素类型 参考文献 eigen 矩阵初始化 多维矩阵 数组 MatrixXi a { // construct a 2x2 matrix{1, 2}, // first row{3, 4} // second row }; Matrix<do…...

堆箱子00

题目链接 堆箱子 题目描述 注意点 将箱子堆起来时&#xff0c;下面箱子的宽度、高度和深度必须大于上面的箱子 解答思路 初始想到深度优先遍历&#xff0c;最后超时了参照题解使用动态规划&#xff0c;先将盒子从小到大进行排序&#xff0c;dp[i]存储的是到第i个箱子时堆箱…...

Linux 命令:iftop

1. 写在前面 本文主要介绍 Linux iftop&#xff08;Interface TOP&#xff09; 命令&#xff1a;iftop 是一款小巧、免费且功能强大的网卡实时流量监控工具。监控指定网卡的实时流量、端口连接信息、反向解析 IP 等&#xff0c;还可以精确显示本机网络流量及网络内各主机和本机…...

web学习笔记(六十九)vue2

目录 1. vue2创建脚手架项目 2.vue2如何关闭eslint 1. vue2创建脚手架项目 &#xff08;1&#xff09;在cmd窗口输入npm install -g vue/cli命令行&#xff0c;快速搭建脚手架。 &#xff08;2&#xff09; 创建vue2项目 &#xff08;3&#xff09; 选择配置项目&#xff0c…...

JavaScript全解:从基础到高级,掌握每一个知识点

引言&#xff1a; JavaScript是一种广泛使用的脚本语言&#xff0c;主要用于Web浏览器&#xff0c;但近年来也扩展到了服务器端&#xff08;Node.js&#xff09;和其他领域。它允许开发者创建交互式的网页&#xff0c;处理数据&#xff0c;控制用户界面&#xff0c;甚至构建完…...

RabbitMQ的Direct交换机

Direct交换机 BindingKey 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&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 &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&am…...

6.26.1 残差卷积变压器编码器的混合工作流程用于数字x线乳房x光片乳腺癌分类

基于残差卷积网络和多层感知器变压器编码器(MLP)的优势&#xff0c;提出了一种新型的混合深度学习乳腺病变计算机辅助诊断(CAD)系统。利用骨干残差深度学习网络创建深度特征&#xff0c;利用Transformer根据自注意力机制对乳腺癌进行分类。所提出的CAD系统具有识别两种情况乳腺…...

[leetcode]avoid-flood-in-the-city 避免洪水泛滥

. - 力扣&#xff08;LeetCode&#xff09; 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基本使用案例 一、数据结构&#xff1a;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

嵌入&#xff08;Embedding&#xff09;是一种将高维数据映射到低维空间的技术&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;、计算机视觉和推荐系统等领域。嵌入技术的核心思想是将复杂的数据表示为低维向量&#xff0c;使其在这个低维空间中保留尽可能多的…...

Pandas中的数据转换[细节]

今天我们看一下Pandas中的数据转换&#xff0c;话不多说直接开始&#x1f387; 目录 一、⭐️apply函数应用 apply是一个自由度很高的函数 对于Series&#xff0c;它可以迭代每一列的值操作&#xff1a; 二、⭐️矢量化字符串 为什么要用str属性 替换和分割 提取子串 …...

vue2面试题——路由

1. 路由的模式和区别 路由的模式&#xff1a;history&#xff0c;hash 区别&#xff1a; 1. 表象不同 history路由&#xff1a;以/为结尾&#xff0c;localhost:8080——>localhost:8080/about hash路由&#xff1a;会多个#&#xff0c;localhost:8080/#/——>localhost:…...

【AI应用探讨】—朴素贝叶斯应用场景

目录 文本分类 推荐系统 信息检索 生物信息学 金融领域 医疗诊断 其他领域 文本分类 垃圾邮件过滤&#xff1a;朴素贝叶斯被广泛用于垃圾邮件过滤任务&#xff0c;通过邮件中的文本内容来识别是否为垃圾邮件。例如&#xff0c;它可以基于邮件中出现的单词或短语的概率来…...

使用matlab的大坑,复数向量转置!!!!!变量区“转置变量“功能(共轭转置)、矩阵转置(默认也是共轭转置)、点转置

近期用verilog去做FFT相关的项目&#xff0c;需要用到matlab进行仿真然后和verilog出来的结果来做对比&#xff0c;然后计算误差。近期使用matlab犯了一个错误&#xff0c;极大的拖慢了项目进展&#xff0c;给我人都整emo了&#xff0c;因为怎么做仿真结果都不对&#xff0c;还…...

昇思25天学习打卡营第8天|保存与加载

1. 学习内容复盘 1.1 保存与加载 上一章节主要介绍了如何调整超参数&#xff0c;并进行网络模型训练。在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;本章…...

【vueUse库Animation模块各函数简介及使用方法】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseAnimation函数1. useInter…...

ROS Noetic下用Python脚本在Gazebo里动态生成障碍物(附完整代码和常见报错解决)

ROS Noetic下Python脚本动态生成Gazebo障碍物的工程实践 在机器人仿真测试中&#xff0c;动态生成环境障碍物是验证导航算法鲁棒性的关键手段。传统手动拖拽方式效率低下且难以复现特定测试场景&#xff0c;而通过编程控制Gazebo仿真环境则能实现测试流程的自动化与标准化。本文…...

数字图像处理核心算法手撕实现 (一)

1. 数字图像处理基础概念 数字图像处理就像给照片做美容手术&#xff0c;只不过操作对象是像素矩阵。我第一次接触这个概念是在大学实验室&#xff0c;当时对着一个512x512的灰度图矩阵发呆了半小时&#xff0c;才明白那些0-255的数字代表着什么。 空间分辨率相当于照片的&qu…...

React - React Redux 数据共享、Redux DevTools、React Redux 最终优化

一、React Redux 数据共享 1、基本介绍 combineReducers 函数用于汇总所有的 Reducer 变为一个总的 Reducer 2、演示 &#xff08;1&#xff09;redux constant // 定义 action 中 type 的常量值export const INCREMENT "increment"; export const DECREMENT "…...

React+GSAP实战:5种酷炫滚动动画效果完整代码分享(含ScrollTrigger配置)

ReactGSAP实战&#xff1a;5种酷炫滚动动画效果完整代码分享&#xff08;含ScrollTrigger配置&#xff09; 在现代Web开发中&#xff0c;流畅的滚动动画已经成为提升用户体验的关键因素。作为前端开发者&#xff0c;我们经常需要实现各种吸引眼球的滚动效果&#xff0c;从简单的…...

从夯到拉,大模型岗位全攻略:程序员转型指南与避坑指南

文章详细解析了大模型领域五个梯队岗位的工作内容、技能要求及发展前景&#xff0c;从底层预训练工程师到应用开发工程师&#xff0c;为不同背景的程序员提供转型建议。同时指出行业人才缺口巨大&#xff0c;传统程序员可凭借编程基础实现职业升级&#xff0c;并推荐系统学习路…...

郭老师-我们为什么要爱国?

我们为什么要爱国&#xff1f; ——因为家在&#xff0c;根在&#xff0c;魂在“你可以不爱你的管家&#xff0c; 但必须爱你家的房子。”&#x1f33f; 国家如屋&#xff0c;人民为主&#xff0c; 执政者不过管家—— 而这屋&#xff0c;是我们的命脉所系。&#x1f3e0; 一、…...

比特币钱包密码与助记词恢复工具:从入门到精通

比特币钱包密码与助记词恢复工具&#xff1a;从入门到精通 【免费下载链接】btcrecover An open source Bitcoin wallet password and seed recovery tool designed for the case where you already know most of your password/seed, but need assistance in trying different…...

RWKV7-1.5B-g1a轻量部署方案:中小企业AI落地首选,年省GPU成本超40%

RWKV7-1.5B-g1a轻量部署方案&#xff1a;中小企业AI落地首选&#xff0c;年省GPU成本超40% 1. 为什么选择RWKV7-1.5B-g1a 在当今AI技术快速发展的背景下&#xff0c;中小企业往往面临高昂的GPU计算成本和技术门槛。rwkv7-1.5B-g1a作为一款基于RWKV-7架构的多语言文本生成模型…...

AzurLaneAutoScript:碧蓝航线终极自动化助手完全指南

AzurLaneAutoScript&#xff1a;碧蓝航线终极自动化助手完全指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 在碧蓝航线…...

Arcgis符号化实战:用矢量文件制作专业级统计地图(附最新配色方案)

ArcGIS符号化实战&#xff1a;用矢量文件制作专业级统计地图&#xff08;附最新配色方案&#xff09; 当你面对一叠枯燥的表格数据时&#xff0c;是否想过如何让这些数字"活"起来&#xff1f;统计地图正是将抽象数据转化为直观视觉表达的利器。作为地理信息系统领域的…...