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

DAY4 网络编程(广播和多线程并发)

作业1:

          1、将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。

send.c代码:

#include <myhead.h>
#define IP "192.168.61.255"//广播IP
#define PORT 7777
int main(int argc, const char *argv[])
{int oldfd=socket(AF_INET,SOCK_DGRAM,0);if(oldfd==-1){perror("socket");return -1;}int n=-1;if(setsockopt(oldfd,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n))==-1){perror("setsockopt");return -1;}printf("允许广播设置成功\n");struct sockaddr_in send={.sin_family=AF_INET,.sin_port=htons(PORT),.sin_addr.s_addr=inet_addr(IP),};char buff[1024];while(1){bzero(buff,sizeof(buff));fgets(buff,sizeof(buff),stdin);sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr*)&send,sizeof(send));}close(oldfd);return 0;
}

recv.c代码:

#include <myhead.h>
#define IP "192.168.61.255"
#define PORT 7777
int main(int argc, const char *argv[])
{int oldfd=socket(AF_INET,SOCK_DGRAM,0);if(oldfd==-1){perror("socket");return -1;}struct sockaddr_in recv={.sin_family=AF_INET,.sin_port=htons(PORT),.sin_addr.s_addr=inet_addr(IP),};if(bind(oldfd,(struct sockaddr*)&recv,sizeof(recv))==-1){perror("bind");return -1;}char buff[1024];socklen_t len=sizeof(recv);while(1){bzero(buff,sizeof(buff));recvfrom(oldfd,buff,sizeof(buff),0,(struct sockaddr*)&recv,&len);printf("接收到%s的消息:%s\n",inet_ntoa(recv.sin_addr),buff);}close(oldfd);return 0;
}

运行测试结果:

作业2:

        使用多线程基于TCP协议的并发执行,一个服务器对应多个客户端实现通信实验。

server.c代码:

#include <myhead.h>
#define IP "192.168.60.82"
#define PORT 8888
#define BACKLOG 20
typedef struct
{int newfd;struct sockaddr_in client;
}DDD;
void *fun(void *sss)
{char buff[1024];DDD s=*(DDD *)sss;int newfd=s.newfd;struct sockaddr_in client=s.client;while(1){int len=recv(newfd,buff,sizeof(buff),0);{if(len==0){printf("客户端下线\n");break;}}printf("接收到%s的消息:%s\n",inet_ntoa(client.sin_addr),buff);strcpy(buff,"666");send(newfd,buff,sizeof(buff),0);printf("发送成功\n");}pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{int oldfd=socket(AF_INET,SOCK_STREAM,0);if(oldfd==-1){perror("socket");return -1;}int n=1;if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(n))==-1){perror("setsockopt");return -1;}struct sockaddr_in server={.sin_family=AF_INET,.sin_port=htons(PORT),.sin_addr.s_addr=inet_addr(IP),};if(bind(oldfd,(struct sockaddr*)&server,sizeof(server))==-1){perror("bind");return -1;}if(listen(oldfd,BACKLOG)==-1){perror("listen");return -1;}struct sockaddr_in client;socklen_t client_len=sizeof(client);while(1){   int newfd=accept(oldfd,(struct sockaddr*)&client,&client_len);DDD s;s.newfd=newfd;s.client=client;pthread_t tid;if(pthread_create(&tid,NULL,fun,&s)==-1){perror("pthread_create");return -1;}pthread_detach(tid);}return 0;
}

client.c代码:

#include <myhead.h>
#define IP "192.168.60.82"
#define PORT 8888
#define BACKLOG 20
int main(int argc, const char *argv[])
{int oldfd=socket(AF_INET,SOCK_STREAM,0);if(oldfd==-1){perror("socket");return -1;}int n=1;if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(n))==-1){perror("setsockopt");return -1;}struct sockaddr_in server={.sin_family=AF_INET,.sin_port=htons(PORT),.sin_addr.s_addr=inet_addr(IP),};if(connect(oldfd,(struct sockaddr*)&server,sizeof(server))==-1){perror("connect");return -1;}char buff[1024];while(1){  fgets(buff,sizeof(buff),stdin);buff[strlen(buff)-1]='\0';send(oldfd,buff,sizeof(buff),0);recv(oldfd,buff,sizeof(buff),0);printf("接收到服务器消息:%s\n",buff);}close(oldfd);return 0;
}

运行测试结果:

作业3:

        流式域套接字实现(TCP)

服务器代码:

#include <myhead.h>
#define BACKLOG 100
int main(int argc, const char *argv[])
{//1、创建流式域套接字int oldfd = socket(AF_UNIX,SOCK_STREAM,0);//创建流式域套接字if(oldfd==-1){perror("socket");return -1;}//2、绑定本地套接字文件作为服务器身份if(access("./myserver",F_OK)==0)//如果存在本地文件就删除{if(unlink("./myserver")==-1)//删除文件{perror("unlink");return -1;}}struct sockaddr_un server;server.sun_family = AF_UNIX;//绑定本地套接字strcpy(server.sun_path,"./myserver");//绑定本地文件if(bind(oldfd,(struct sockaddr *)&server,sizeof(server))==-1){perror("bind");return -1;}//3、监听if(listen(oldfd,BACKLOG)==-1){perror("listen");return -1;}//4、接收客户端请求char buff[1024];struct sockaddr_un client;socklen_t client_len = sizeof(client);int newfd = accept(oldfd,(struct sockaddr *)&client,&client_len);printf("%s发来连接请求\n",client.sun_path);//打出文件名即可while(1){bzero(buff,sizeof(buff));int len=recv(newfd,buff,sizeof(buff),0);if(len==0){printf("客户端下线\n");break;}printf("接收到信息:%s\n",buff);strcpy(buff,"666");send(newfd,buff,sizeof(buff),0);printf("发送成功\n");}close(oldfd);close(newfd);return 0;
}

客户端代码:

#include <myhead.h>
#define BACKLOG 100
int main(int argc, const char *argv[])
{//1、创建流式域套接字int oldfd = socket(AF_UNIX,SOCK_STREAM,0);//创建流式域套接字if(oldfd==-1){perror("socket");return -1;}struct sockaddr_un server;server.sun_family = AF_UNIX;strcpy(server.sun_path,"./myserver");if(connect(oldfd,(struct sockaddr*)&server,sizeof(server))==-1) {perror("connect");return -1;}char buff[1024];while(1){fgets(buff,sizeof(buff),stdin);buff[strlen(buff)-1]='\0';send(oldfd,buff,sizeof(buff),0);printf("发送成功\n");}close(oldfd);return 0;
}

运行测试结果:

相关文章:

DAY4 网络编程(广播和多线程并发)

作业1&#xff1a; 1、将广播发送和接收端实现一遍&#xff0c;完成一个发送端发送信息&#xff0c;对应多个接收端接收信息实验。 send.c代码&#xff1a; #include <myhead.h> #define IP "192.168.61.255"//广播IP #define PORT 7777 int main(int argc, …...

C++个人复习(4)

C中为什么要引入make_shared,它有什么优点 1. 减少内存分配次数 使用 make_shared 时&#xff0c;内存分配只发生一次&#xff0c;它同时分配了对象和控制块&#xff08;用于管理引用计数等信息&#xff09;。而如果直接使用 new 创建对象并传递给 shared_ptr&#xff0c;则会…...

Dockerhub镜像加速

一、背景 dockerhub由于被封锁和站点处于国外的原因&#xff0c;docker pull拉取镜像非常慢&#xff0c;有时候直接都无法拉取。严重妨碍了我们的学习进度以及日常使用。 总结了一些proxy代理的镜像站点&#xff0c;配置之后速度会有明显提升&#xff0c;大家可以参考使用。 二…...

11.20讲座笔记

信息门户 -------- 人才培养方案&#xff08;重要&#xff09; 结构化矛盾------需求方&#xff08;企业&#xff09; ------供给方&#xff08;高校&#xff09; 电子方向职业 -------- 基建、基础算力 -------中国 1st &#xff08;已经相对完善饱和&#xff09; 网…...

网络协议之UDP

一、UDP协议定义 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种面向无连接的、不可靠的、基于数据报的传输层通信协议。UDP在传输数据时不需要建立连接&#xff0c;直接将数据包发送出去。这种特性使得UDP在实时性要求较高的应用场景中…...

Elasticsearch面试内容整理-常见问题和解决方案

在使用 Elasticsearch 的过程中,可能会遇到各种常见问题,如集群状态异常、分片未分配、查询性能低下等。这些问题往往影响系统的可用性和性能,因此理解这些问题的成因和解决方案非常重要。以下是 Elasticsearch 常见问题及其解决方案的整理。 集群状态问题 Elasticsearch 集…...

React 表单Form 中的 useForm

1、介绍 useForm 是 React Hook Form 中的核心 Hook&#xff0c;用于管理表单的状态和行为。它提供了处理表单验证、数据收集、状态管理等功能的简便方法。useForm 本质上是用于创建和配置表单&#xff0c;并允许你在组件中与表单字段交互。 2、基本用法 useForm 是一个函数…...

用指针函数寻找数组中的最大值与次大值

#include <stdio.h>// 函数用于找出数组中的最大值和次大值 void LargestTow(int a[], int n, int *pfirst, int *psecond) {*pfirst a[0];*psecond a[1];if (*psecond > *pfirst) {// 如果初始的次大值大于最大值&#xff0c;交换它们int temp *pfirst;*pfirst *…...

人工智能在金融领域的创新与应用

引言&#xff1a;AI如何重塑金融行业&#xff1f; 金融行业是人工智能&#xff08;AI&#xff09;技术的最佳应用场景之一。通过数据分析、模式识别和自动化处理&#xff0c;AI正为金融行业提供高效、安全和智能化的解决方案。从反欺诈到投资决策&#xff0c;AI正逐步改变金融服…...

shell脚本(4)一文解决比较运算符用户交互

免责声明 学习视频来自B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 比较运算符 在Shell脚本中…...

windows 操作系统下载 Android源码教程

前言 开始我是装了hyber-v 虚拟机ubuntu 的&#xff0c;然而非常的卡顿且难用。因此我尝试在windows上使用repo&#xff0c;因此有了这篇文章 补充 第二天发现编译源码也需要linux命令因为源码中的很多脚本都是.sh的 因此最终通过安装WSL解决&#xff08;在window应用商店就…...

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词英文模板&#x1f4af;提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…...

vue3-input 搜索框

第一种 实现效果 实现代码 <template><div class="input-box mb20"><input type="text" class="input" /><span class="span">搜</span></div> </template><script setup> import …...

记录eslint报错的情况

这几天在调试vue的eslint&#xff0c;害&#xff0c;我领导说eslint要打开规范代码&#xff0c;顺带看了一下eslint的规则&#xff0c;并且研究一下报错。切记每次修改了.eslintrc配置文件&#xff0c;需要重启项目再查看控制台&#xff0c;否则之前的报错会一直存在。 第一个…...

mongodb多表查询,五个表查询

需求是这样的&#xff0c;而数据是从mysql导入进来的&#xff0c;由于mysql不支持数组类型的数据&#xff0c;所以有很多关联表。药剂里找药物&#xff0c;需要药剂与药物的关联表&#xff0c;然后再找药物表。从药物表里再找药物与成分关联表&#xff0c;最后再找成分表。 这里…...

Git Bash + VS Code + Windows11 Git命令报错莫名奇妙的问题

环境&#xff1a; git version 2.47.0.windows.1 gitbash版本&#xff1a;Git-2.47.0-64-bit windows版本&#xff1a; Windows 11 专业版 版本号 23H2 安装日期 ‎2024/‎11/‎16 操作系统版本 22631.4460 体验 Windows Feature Experience Pack 1000.22700.10…...

湛江市社保卡申领指南:手机获取电子照片回执单号

在湛江市&#xff0c;社保卡的申领流程已经实现了数字化&#xff0c;为市民带来了极大的便利。特别是通过手机获取数码照片回执单号&#xff0c;这一环节更是简化了申领过程。今天&#xff0c;我们将详细介绍如何不去照相馆&#xff0c;利用手机来获取数码照片回执单号&#xf…...

Linux离线安装Docker命令,简单镜像操作

解压安装包 首先&#xff0c;使用 tar 命令解压 docker-27.3.1.tgz 安装包&#xff1a; tar -zxvf docker-27.3.1.tgz 将二进制文件移动到可执行路径上的目录 接着&#xff0c;将解压出来的 Docker 二进制文件复制到系统的可执行路径&#xff08;通常是 /usr/bin/&#xff09…...

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境&#xff0c;它在现代 JavaScript 开发中扮演着重要角色。然而&#xff0c;许多开发者在使用 Node.js 时常常会感到困惑&#xff0c;尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异&#xff0c;帮助你全面理解两者的设计…...

基于MySQL的 CMS(内容管理系统)的表结构设计

目录 1. 用户管理 (Users) 2. 内容管理 (Content/Posts) 3. 分类 (Categories) 4. 标签 (Tags) 5. 内容与分类关系 (Content_Category) 6. 内容与标签关系 (Content_Tag) 7. 媒体库 (Media) 8. 设置 (Settings) 9. 评论 (Comments) 10. 活动日志 (Activity_Log) 11. …...

算力基建工程:NVIDIA产业链下的求职机会——什么是CUDA编程,为什么它成为了2026年的“金饭碗”?

在2026年的北美科技求职市场中&#xff0c;AI 行业的红利正在经历一次极其冷酷的“底层沉淀”。当应用层的 AI 产品陷入残酷的同质化红海竞争&#xff0c;且大量依赖 API 调用的传统软件工程师岗位面临饱和风险时&#xff0c;大厂的巨额资金和核心 Headcount 正在疯狂向一个更硬…...

Webpacker终极集成指南:如何与React、Vue、TypeScript完美协作

Webpacker终极集成指南&#xff1a;如何与React、Vue、TypeScript完美协作 【免费下载链接】webpacker Use Webpack to manage app-like JavaScript modules in Rails 项目地址: https://gitcode.com/gh_mirrors/we/webpacker Webpacker是Rails生态系统中一个革命性的工…...

从 OData 元数据到强类型前端:SAP UI5 与 TypeScript 生成服务类型定义的完整实践

在 UI5 项目里引入 TypeScript,很多团队已经能享受到编辑器补全、静态检查、重构安全这些直接收益。可一旦应用开始真正处理业务数据,一个很现实的问题就会出现:UI5 的官方类型定义覆盖了控件、模型、事件、基类 API,但你自己服务里的实体结构,像 Person、SalesOrder、Bus…...

实践之漏洞挖掘(弱口令)

前言&#xff1a;经过我的不懈努力&#xff0c;也是挖到了弱口令&#xff0c;嘻嘻&#xff0c;学校的&#xff0c;虽然没有泄露什么隐私&#xff0c;但是我交了要更新就是学校的漏洞&#xff0c;过不过都没关系&#xff0c;没过我下次就找有隐私的后台再交嘻嘻正题&#xff1a;…...

AEUX:跨平台设计资产迁移全攻略

AEUX&#xff1a;跨平台设计资产迁移全攻略 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX 破解设计动效衔接难题&#xff1a;重新定义创意工作流价值 在当今数字化设计领域&#xff0…...

LongCat-Video-Avatar 正式发布,实现开源SOTA级拟真表现

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

效率提升秘籍:用快马AI一键生成智能书签与网址检索助手

最近在整理浏览器书签时&#xff0c;发现收藏夹已经乱成一团。每次想找个常用网站都得翻半天&#xff0c;更别提临时需要找新资源时的焦头烂额了。作为一个追求效率的程序员&#xff0c;我决定自己动手做个智能书签助手&#xff0c;没想到在InsCode(快马)平台上半小时就搞定了原…...

为什么Python开发者需要关注RadarSimPy:现代雷达系统仿真的技术突破

为什么Python开发者需要关注RadarSimPy&#xff1a;现代雷达系统仿真的技术突破 【免费下载链接】radarsimpy Radar Simulator built with Python and C 项目地址: https://gitcode.com/gh_mirrors/ra/radarsimpy 在自动驾驶、无人机探测和智能安防等领域&#xff0c;雷…...

千问3.5-27B保姆级教程:从实例ID获取https访问地址的完整流程

千问3.5-27B保姆级教程&#xff1a;从实例ID获取https访问地址的完整流程 1. 前言&#xff1a;认识Qwen3.5-27B模型 Qwen3.5-27B是Qwen官方发布的视觉多模态理解模型&#xff0c;它不仅能够进行文本对话&#xff0c;还能理解图片内容。这个模型已经在4张RTX 4090 D 24GB显卡的…...

3分钟搞定专业视频!Auto-Video-Generator让你的创意瞬间变现实

3分钟搞定专业视频&#xff01;Auto-Video-Generator让你的创意瞬间变现实 【免费下载链接】auto-video-generateor 自动视频生成器&#xff0c;给定主题&#xff0c;自动生成解说视频。用户输入主题文字&#xff0c;系统调用大语言模型生成故事或解说的文字&#xff0c;然后进…...