网络编程值UDP

1. 知识点

1.1 TCP和UDP优缺点

1.2 UDP通信流程

1.2.1 服务端

1. 创建udp套接字

2. 初始化服务端网络地址结构  

3. 绑定服务端网络地址

4.创建结构体用来存储客户端网络地址结构

5. 接收客户数据

1.2.2 客户端

1. 创建udp套接字

2. 初始化服务器网络地址结构

3. 客户端先发送数据

2. 函数接口参考course-1

3. udp通信的接收和发送

udp_server.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>//udp通信
//服务端 和客户端 接收发送信息int main(int argc,char** argv)
{//1. 创建udp套接字int socket_fd = socket(AF_INET,SOCK_DGRAM,0);if(socket_fd == -1){printf("创建套接字失败\n");return -1;}//2. 初始化服务端网络地址结构  //4.创建结构体cliaddr用来存储客户端网络地址结构struct sockaddr_in cliaddr,seraddr;//cliaddr客户  seraddr服务//初始化服务端地址seraddr.sin_family = AF_INET;seraddr.sin_port = htons(atoi(argv[2]));//设置端口 //主机字节序的短整型数据seraddr.sin_addr.s_addr = inet_addr(argv[1]);//将将点分十进制转转为无符号的32位网络地址socklen_t seraddr_len = sizeof(seraddr);socklen_t cliaddr_len = sizeof(cliaddr);//3. 绑定服务端网络地址int bind_ok = bind(socket_fd,(struct sockaddr*)&seraddr,seraddr_len);if(bind_ok==-1){perror("bind failed");}//监听,可有可无listen(socket_fd,4);char sbuf[128];//发送char rbuf[128];//接收while(1){memset(sbuf,0,sizeof(sbuf));memset(rbuf,0,sizeof(rbuf));//5. 接收客户数据,这里先接收客户发送的消息,第五个参数可以得到客户的地址recvfrom(socket_fd,rbuf,sizeof(rbuf),0,(struct sockaddr *)&cliaddr,&cliaddr_len);printf("server接收数据:%s\n",rbuf);//发送,发送个客户,因为我们recvfrom函数接收已经得到了客户地址了fgets(sbuf,sizeof(sbuf),stdin);sendto(socket_fd,sbuf,sizeof(sbuf),0,(struct sockaddr *)&cliaddr,cliaddr_len);printf("server发送数据:%s\n",sbuf);//退出if(strcmp("bye\n",sbuf)==0){break;}//退出if(strcmp("bye\n",rbuf)==0){break;}}   close(socket_fd);return 0;
}

udp_client.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>//udp通信
//客户端 和 服务端 发送接收信息int main(int argc,char** argv)
{//1. 创建udp套接字int socket_fd = socket(AF_INET,SOCK_DGRAM,0);if(socket_fd == -1){printf("创建套接字失败\n");return -1;}//2. 初始化服务器网络地址结构struct sockaddr_in seraddr;//cliaddr客户  seraddr服务seraddr.sin_family = AF_INET;seraddr.sin_port = htons(atoi(argv[2]));//设置端口 //主机字节序的短整型数据seraddr.sin_addr.s_addr = inet_addr(argv[1]);//将将点分十进制转转为无符号的32位网络地址socklen_t seraddr_len = sizeof(seraddr);//这个绑定可有可无// struct sockaddr_in cliaddr;// socklen_t cliaddr_len = sizeof(cliaddr);// int bind_ok = bind(socket_fd,(struct sockaddr*)&cliaddr,cliaddr_len);// if(bind_ok==-1){//     perror("bind failed");// }//监听,可有可无listen(socket_fd,4);char sbuf[128];//发送char rbuf[128];//接收while(1){memset(sbuf,0,sizeof(sbuf));memset(rbuf,0,sizeof(rbuf));//3. 客户端先发送数据,发给服务端,因为上面我们初始化了服务器地址结构fgets(sbuf,sizeof(sbuf),stdin);sendto(socket_fd,sbuf,sizeof(sbuf),0,(struct sockaddr *)&seraddr,seraddr_len);printf("client发送数据:%s\n",sbuf);//接收服务端数据recvfrom(socket_fd,rbuf,sizeof(rbuf),0,(struct sockaddr *)&seraddr,&seraddr_len);printf("client接收数据:%s\n",rbuf);//退出if(strcmp("bye\n",sbuf)==0){break;}//退出if(strcmp("bye\n",rbuf)==0){break;}}   close(socket_fd);return 0;
}

4. 可以将 通信的双发 接收和发送 写在一起

whole_udp.c

#include <sys/types.h>        
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>int sock_fd = -1;void *recv_addr2(void *arg)
{struct sockaddr outside_addr = *(struct sockaddr *)arg;socklen_t addr2_len = sizeof(outside_addr);char sbuf[128];while(1){memset(sbuf,0,sizeof(sbuf));fgets(sbuf,sizeof(sbuf),stdin);sendto(sock_fd,sbuf,sizeof(sbuf),0,(struct sockaddr *)&outside_addr,addr2_len);}
}int main(int argc, char **argv)
{//创建udp套接字sock_fd = socket(AF_INET,SOCK_DGRAM,0);//定义结构体struct sockaddr_in local_addr, outside_addr;//自己本地的地址信息local_addr.sin_family = AF_INET;local_addr.sin_port = htons(atoi(argv[2]));local_addr.sin_addr.s_addr = inet_addr(argv[1]);//计算本地大小socklen_t local_addr_len = sizeof(local_addr);//绑定本地bind(sock_fd,(struct sockaddr *)&local_addr,local_addr_len);//外地地址信息outside_addr.sin_family = AF_INET;outside_addr.sin_port = htons(atoi(argv[4]));outside_addr.sin_addr.s_addr = inet_addr(argv[3]);//计算外地大小socklen_t outside_addr_len = sizeof(outside_addr);//监听 ,可有可无listen(sock_fd,4);//创建线程pthread_t tid;//传参把外地地址信息传到线程函数中pthread_create(&tid,NULL,recv_addr2,(void *)&outside_addr);char rbuf[128];//接收while(1){memset(rbuf,0,sizeof(rbuf));//接收,接收外地信息recvfrom(sock_fd,rbuf,sizeof(rbuf),0,(struct sockaddr *)&outside_addr,&outside_addr_len);//将是一个用于将 IPv4 地址从二进制形式转换为点分十进制字符串形式的C库函数。char *ip = inet_ntoa(outside_addr.sin_addr);//ipunsigned short port = ntohs(outside_addr.sin_port);//端口号printf("[来自%s  %u outside_addr]:%s\n",ip,port,rbuf);}}

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

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

相关文章

STM32 map文件详解

文章目录 1. 前言2. 生成 .map 文件3 .map 文件的组成3.1 Section Cross References - 各个源文件之间函数的调用关系3.2 Removing Unused input sections from the image - 移除未使用的模块3.3 Image Symbol Table - 映射符号表&#xff1a;描述各&#xff08;程序段 / 数据&…

Python---类的综合案例

1、需求分析 设计一个Game类 属性&#xff1a; 定义一个类属性top_score记录游戏的历史最高分 定义一个实例属性player_name记录当前游戏的玩家姓名 方法&#xff1a; 静态方法show_help显示游戏帮助信息 类方法show_top_score显示历史最高分 实例方法start_game开始当前…

图的邻接链表储存

喷了一节课 。。。。。。。、。 #include<stdio.h> #include<stdlib.h> #define MAXNUM 20 //每一个顶点的节点结构&#xff08;单链表&#xff09; typedef struct ANode{ int adjvex;//顶点指向的位置 struct ArcNode *next;//指向下一个顶点 …

macOS Big Sur/Mac电脑安装vscode显示您没有权限来打开应用程序‘Visual Studio Code‘ 请联系您的电脑或网络管理员问题修复

错误方法 首先我以为我的权限不足。&#xff0c;需要去用户群组里设置。结果根本不是这个的问题。 1.在系统偏好设置->用户与群组检查了一下我的用户是不是管理员 结果发现是管理员 2.根据苹果提示&#xff0c;右键我的文件夹->显示简介->最下面的共享与权限 解锁&…

maven学习笔记总结

目录 一、maven简介 二、GAVP属性 三、基于 IDLE 的 Maven 工程创建 1&#xff09;java标准工程&#xff08;Javase&#xff09;的创建 2&#xff09;java企业工程&#xff08;Javaee&#xff09;的创建 a&#xff09;手动创建 b&#xff09;插件方式创建&#xff08;fil…

Linux:dockerfile编写搭建tomcat练习(9)

我使用的httpyum仓库 本地使用了5个文件&#xff0c;tomcat使用的官网解压直接用的包】 Dockerfile 主配置文件 基于centos基础镜像 jdk1.8.0_91 java环境 run.sh 启动脚本 centos.repo 仓库文件 tomcat 源码包 vim Dockerfile写入FROM centos MAINTAINER ta…

SpringAOP专栏二《原理篇》

上一篇SpringAOP专栏一《使用教程篇》-CSDN博客介绍了SpringAop如何使用&#xff0c;这一篇文章就会介绍Spring AOP 的底层实现原理&#xff0c;并通过源代码解析来详细阐述其实现过程。 前言 Spring AOP 的实现原理是基于动态代理和字节码操作的。不了解动态代理和字节码操作…

智能优化算法应用:基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.参考…

免费网页抓取工具大全【附下载和工具使用教程】

在当今信息爆炸的时代&#xff0c;获取准确而丰富的数据对于企业决策和个人研究至关重要。而网页抓取工具作为一种高效获取互联网数据的方式&#xff0c;正逐渐成为大家解决数据需求的得力助手。本文将深入探讨网页抓取工具的种类&#xff0c;并为大家提供简单实用的页面采集教…

HarmonyOS创建JavaScript(类 Web开发模式)项目

上文 HarmonyOS带大家创建自己的第一个Page页面并实现路由跳转(ArkTS)带大家创建了我们项目中第一个自己创建的page 并完成了一个跳转逻辑的编写 上文的开发模式是 ArkTS 的 也被称为 声明式开发范式 还有一种 javaScript的 类Web开发模式 这种方式就类似于我们传统的前端开发模…

注意力机制的快速学习

注意力机制的快速学习 注意力机制 将焦点聚焦在比较重要的事物上 我&#xff08;查询对象Q&#xff09;&#xff0c;这张图&#xff08;被查询对象V&#xff09; 我看一张图&#xff0c;第一眼&#xff0c;就会判断那些东西对我而言比较重要&#xff0c;那些对于我不重要&…

POJ 3735 Training little cats 动态规划(矩阵的幂)

一、题目大意 我们有N只猫&#xff0c;每次循环进行K次操作&#xff08;N<100&#xff0c;K<100&#xff09;&#xff0c;每次操作可有以下三种选择&#xff1a; 1、g i 给第i只猫1个食物 2、e i 让第i只猫吃完它所有的食物 3、s i j 交换第i和j只猫的食物。 求出M次…

UDP通信

第二十一章 网络通信 本章节主要讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 接下来会一一讲解 UDP通信 主要的方向是一对多通信方式 UDP通信就是一下子可以通信多个对象&#xff0c;这就…

电子眼+无人机构建平安城市视频防控监控方案

电子眼&#xff08;也称为监控摄像机&#xff09;可以通过安装在城市的不同角落&#xff0c;实时监控城市的各个地方。它们可以用于监测交通违法行为、监控公共场所的安全以及实时监测特定区域的活动情况。通过电子眼的应用&#xff0c;可以帮助警方及时发现并响应各类安全事件…

9.关于Java的程序设计-基于Springboot的家政平台管理系统设计与实现

摘要 随着社会的进步和生活水平的提高&#xff0c;家政服务作为一种重要的生活服务方式逐渐受到人们的关注。本研究基于Spring Boot框架&#xff0c;设计并实现了一种家政平台管理系统&#xff0c;旨在提供一个便捷高效的家政服务管理解决方案。系统涵盖了用户注册登录、家政服…

LVS-DR+Keepalived+动静分离实验

架构图 解释一下架构&#xff0c;大概就是用Keepalived实现两台DR服务器的LVS负载均衡&#xff0c;然后后端服务器是两台Nginx服务器两台Tomcat服务器并且实现动静分离这个实验其实就是把 LVS-DRKeepalived 和 动静分离 给拼起来&#xff0c;真的是拼起来&#xff0c;两个部分…

0013Java程序设计-基于Vue的上课签到系统的设计与实现

文章目录 **摘 要**目录系统设计4.2学生签到4.3 签到信息列表4.4 用户信息管理5.1系统登录5.1.1 登录5.1.2 清除用户登记记录5.1.3 登录拦截 5.2用户管理5.2.2 用户添加5.2.3 用户编辑5.2.4 用户删除5.2.5 用户分页 5.3签到信息5.3.1签到信息列表 5.4学生签到5.4.1学生签到 开发…

Python Appium Selenium 查杀进程的实用方法

一、前置说明 在自动化过程中&#xff0c;经常需要在命令行中执行一些操作&#xff0c;比如启动应用、查杀应用等&#xff0c;因此可以封装成一个CommandExecutor来专门处理这些事情。 二、操作步骤 # cmd_util.pyimport logging import os import platform import shutil i…

virtualenv创建虚拟环境

目录 概念安装创建虚拟环境激活虚拟环境删除虚拟环境退出虚拟环境更改虚拟环境路径 概念 virtualenv是一个创建隔离的Python运行环境的工具。它允许用户为每个Python项目创建一个独立的虚拟环境&#xff0c;以避免不同项目之间的依赖冲突。 安装 pip install virtualenv virtua…

网上商城、宠物商城源码(Java)

javaWebjsp网上书城以及宠物商城源码&#xff0c;功能有购物车、收藏以及下单等等功能 带后台管理功能 运行示意图&#xff1a;