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

网络编程值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);}}

相关文章:

  • 解决微信小程序中 ‘nbsp;‘ 空格不生效的问题
  • pcl-3 pcl结合opencv做svm分类(法向量特征数据)
  • WPF仿网易云搭建笔记(1):项目搭建
  • Navicat 技术指引 | 适用于 GaussDB 分布式的调试器
  • Fabric 画布缩放、拖动、初始化大小
  • kubernetes的服务发现(二)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • 【S32DS报错】-3-提示J-Link GDB Server failed:Device name ‘S32K344‘ not recognised错误
  • 【CSP】202303-2_垦田计划Python实现
  • 图论——最小生成树
  • 黑马头条数据管理平台项目总结
  • Gateway:微服务架构中的关键组件
  • IntelliJ idea卡顿解决,我遇到的比较管用的方案
  • MindOpt APL:一款适合优化问题数学建模的编程语言
  • 集简云 x 零售企业丨快速集成有赞商城和微盛企微管家,实现私域运营自动化
  • 【Leetcode】101. 对称二叉树
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • ES6系列(二)变量的解构赋值
  • happypack两次报错的问题
  • HTTP那些事
  • HTTP--网络协议分层,http历史(二)
  • JavaScript 一些 DOM 的知识点
  • js 实现textarea输入字数提示
  • KMP算法及优化
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Magento 1.x 中文订单打印乱码
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • vue-cli在webpack的配置文件探究
  • vue-loader 源码解析系列之 selector
  • 分布式事物理论与实践
  • 京东美团研发面经
  • 使用Gradle第一次构建Java程序
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小程序button引导用户授权
  • 译米田引理
  • ​如何防止网络攻击?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (1)STL算法之遍历容器
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET Core WebAPI中封装Swagger配置
  • .Net Core与存储过程(一)
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net实现客户区延伸至至非客户区
  • @ConfigurationProperties注解对数据的自动封装
  • @开发者,一文搞懂什么是 C# 计时器!
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票