用进程和线程完成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;
}

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

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

相关文章

1958springboot VUE宿舍管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE宿舍管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09; &#xff0c;系统具有完整的源代码和数…

PyTorch实战:模型训练中的特征图可视化技巧

1.特征图可视化&#xff0c;这种方法是最简单&#xff0c;输入一张照片&#xff0c;然后把网络中间某层的输出的特征图按通道作为图片进行可视化展示即可。 2.特征图可视化代码如下&#xff1a; def featuremap_visual(feature, out_dirNone, # 特征图保存路径文件save_feat…

O2OA的数据库数据库配置-使用不同用户访问Oracle时报错-表或视图不存在

在使用Oracle数据库时&#xff0c;多个O2OA服务器同一个Oracle实例中使用不同的用户启动时&#xff0c;可能会遇到数据库访问的错误。本篇阐述此类问题以及解决方案。 一、先决条件&#xff1a; 1、O2OA已经下载并且解压到指定的目录&#xff1b; 2、Oracle数据库已经完成安…

90 Realistic Arctic Environment Textures snow(90+种逼真的北极环境纹理--雪、冰及更多)

一组90多个逼真的雪、冰、雪地岩石和其他被雪覆盖的地面纹理,供在雪地环境中使用。每个纹理都是可贴的/无缝的,并且完全兼容各种不同的场景--标准的Unity地形、Unity标准着色器、URP、HDRP等等都兼容。 所有的纹理都是4096x4096,并包括一个HDRP掩码,以完全支持HDRP。 特点。…

X86+FPGA, NXP+FPGA:工控稳“固”之选 赋能CPCI/VPX智能轨交新变革

工业IPC在目前大时代背景下面临机遇,但挑战同样也不少。在轨道交通领域&#xff0c;工控机必须具备高可靠性和稳定性&#xff0c;能够在复杂且严苛的工作环境中长时间无故障运行&#xff1b;需要满足严格的实时性和响应性能要求&#xff0c;确保能够迅速准确地处理传感器信号和…

椭圆的几何要素

椭圆的几何要素 flyfish 椭圆的方程为 x 2 a 2 y 2 b 2 1 \frac{x^2}{a^2} \frac{y^2}{b^2} 1 a2x2​b2y2​1。 长半轴 a a a&#xff08;绿色虚线&#xff09;和短半轴 b b b&#xff08;紫色虚线&#xff09;。 焦点 F 1 ( − c , 0 ) F1(-c, 0) F1(−c,0)&#…

暴雨讲堂|通往AGI的必由之路—AI agent是什么?

在三月份英伟达的新品发布会上&#xff0c;黄仁勋反复提及一个词汇— Generalist Embodied Agent&#xff0c;意为“通用具身智能体”&#xff0c;给观众留下了深刻的印象。其实具身智能指的是不同形态的拥有主动感知交互能力的机器人。其实&#xff0c;业界对它还有一个更为熟…

python如何安装ta-lib依赖包

在使用pip install ta-lib安装ta-lib库的时候,出现了以下错误信息。本文记录安装成功的整个过程。 解决办法 1、创建虚拟环境 我们使用conda进行创建一个python=3.8版本的虚拟环境 conda create -n python38 python==3.8激活创建好虚拟环境 conda activate python382、安装步…

媒体访谈 | 广告变现痛点有新解,俄罗斯市场成大热门?

今年一季度&#xff0c;中国自主研发游戏在海外市场实际销售收入达到了40.75亿美元&#xff0c;环比和同比均实现了超过5%的增长&#xff0c;出海&#xff0c;仍是游戏产品近些年来最主要的发展模式之一。 当今的市场环境正经历一系列深刻变革&#xff0c;移动游戏广告市场呈现…

IDEA集成Docker实现快捷部署

本文已收录于专栏 《运维》 目录 背景介绍优势特点操作步骤一、修改Docker配置二、配置Docker插件三、编写Maven插件四、构建Docker镜像五、创建Docker容器 总结提升 背景介绍 在我们手动通过Docker部署项目的时候&#xff0c;都是通过把打包好的jar包放到服务器上并且在服务器…

git提交遇见的<<<<<<<< HEAD无法运行程序问题

在项目文件目录下打开git bash Here 在命令行中输入 git reset --hard HEAD~1 进行复原 git reset --hard HEAD~1 即可

【Java】线程池技术(三)ThreadPoolExecutor 状态与运行源码解析

ThreadPoolExecutor 状态 ThreadPoolExecutor 继承了 AbstractExecutorService&#xff0c;并实现了 ExecutorService 接口&#xff0c;用于管理线程。内部使用了原子整型 AtomicInteger ctl 来表示线程池状态和 Worker 数量。前 3 位表示线程池状态&#xff0c;后 29 位表示 …

python代码生成可执行文件

以下面转换图片尺寸的代码resize_images.py为例&#xff1a; 代码功能&#xff1a;原始图片放在img文件夹中&#xff0c;然后运行代码可以转换成指定分辨率&#xff0c;保存在同一目录下的新生成的文件夹中 import os import sys import cv2 from datetime import datetime f…

在React中,如何利用React.memo函数对函数组件进行优化?

React.memo 是 React 的一个高阶组件&#xff0c;用于对函数组件进行性能优化。它通过记忆化&#xff08;memoization&#xff09;来避免不必要的重新渲染。当组件的 props 没有变化时&#xff0c;React.memo 可以防止组件重新渲染&#xff0c;从而提高应用的性能。 使用 Reac…

wireshark抓包ssl数据出现ignored unknown record的原因

文章目录 前言一、出现原因二、wireshark抓包分析Ignored Unknown RecordTCP segment of a reassembled PDU 总结 前言 使用下面这个例子来观察记录层数据大于TCP MSS时用wireshark抓包出现ignored unknown record的情况并分析原因。 c语言利用openssl实现简单客户端和服务端&…

Rich Human Feedback for Text-to-Image Generation 读论文笔记

Rich Human Feedback for Text-to-Image Generation 读论文笔记 摘要方法细节收集数据的过程人类反馈确认 数据集VQA使用方法数据分析分数统计评价一致性&#xff08;pair alignment&#xff09; 实验模型模型架构模型变体模型其他优化 实验MetricsScoreHeatmapMisalignment 量…

什么是NLP-自然语言处理

什么是NLP-自然语言处理 什么是NLP开通NLP新建项目创建模型 什么是NLP NPL是面向算法小白用户的行业自适应标注、训练和服务平台。该产品支持文本实体抽取、文本分类、关键短语抽取、情感分析、关系抽取、短文本匹配、商品评价解析等 NLP 定制化算法能力&#xff0c;用户无需拥…

【变量与常量】

1.基本程序 容器用来存放物品 声明变量 num 是个用来装整数的变量 &#xff01; 一 个整数变量需要 4 个 byte 存储&#xff0c; 计算机 在内存里为你分配了 4 个 byte 。int num;在代码中&#xff0c;声明一个变量。 常用变量类型 存储不同类型的数据需要声明不同类型的变…

Steam怎么购买黄金树之影 购买了黄金树之影怎么下载DLC教程

《艾尔登法环》大型DLC“黄金树幽影”将于6月21日正式上线&#xff0c;为广大玩家带来全新的冒险与挑战。在“黄金树幽影”中&#xff0c;玩家将拥有专属的强化系统。通过收集探索幽影之地获得的“幽影树的碎片”和“灵灰的加护”&#xff0c;不仅可以大幅度提升玩家的攻击力与…

【从零到一】电子元器件网站建设/开发方案、流程及搭建要点全解

电子元器件行业在数字化转型的大潮下也迎来了前所未有的发展机遇。一个高效、专业、用户友好的电子元器件网站&#xff0c;不仅能够提升品牌形象&#xff0c;还能显著提高销售转化率&#xff0c;增强客户粘性。道合顺芯站点将详细阐述电子元器件开发方案、实施流程&#xff0c;…