udp服务器【Linux网络编程】

目录

一、UDP服务器

1、创建套接字

2、绑定套接字

3、运行 

1)读取数据

2)发送数据

二、UDP客户端

  创建套接字:

客户端不用手动bind

收发数据 

处理消息和网络通信解耦

三、应用场景 

1、服务端执行命令

2、Windows上的客户端

3、简易聊天室

四、可能遇到的问题


一、UDP服务器

1、创建套接字

int socket(int domain,int type,int protocol)

第一个参数表示要创建的套接字的协议家族和域是什么,如下图第一个表示本地通信,第二个表示IPv4的网络通信。

AF_INET也可以写成PF_INET

第二个参数表socket的类型:

SOCK_STREAM:流式套接字(面向字节流eg:TCP)

SOCK_DGRAM:数据报套接字(面向数据报eg:UDP)

第三个参数表示协议类型:填0就行

返回值:文件描述符(网卡设备)

2、绑定套接字

int bind(int sockfd,const struct sockaddr *add,socklen_t addrlen)

关于第二个参数:由于是网络通信,所以我们要先定义一个sockaddr_in(#include <arpa/inet.h>)对象,并把它的值填好。

将指定大小的数据清0

整数ip和字符串ip如何转换?

同时,ip也得是网络字节序。

inet_addr():将字符串ip转整数并保证其时网络字节序。

有了上面两个部分,服务器就初始化成功了。 

3、运行 

 服务器要一直运行。

客户端将数据发送给服务器后,服务器进行处理,再将数据返回给客户端。

1)读取数据

sockfd是接收方的套接字描述符

buf是用来接收数据的。

src_addr是用来接收发送方的信息的。

flags设置为0即可

2)发送数据

sockfd:发送方套接字描述符

buf:指向要发送的数据的缓冲区

len:缓冲区大小

flags:0

dest_addr:接收方结构体指针

addrlen:结构体大小

 通过指令判断服务器是否启动

一个关于IP的问题 

 如果我们用自己的云服务器IP来初始化服务器,会出现以下报错:

云服务器禁止直接绑定公网IP。一般服务器也不会固定绑定一个IP,因为每台机器可能有多个IP,多个IP都可以放出去,如果服务器只绑定一个IP,那就只能收到发往这一个IP的消息。 

bind不填IP地址,就写0(任意地址绑定),让它根据端口号向上交付,这样就可以接收本台主机发给多个IP的消息。

所以,服务器就不需要ip这个字段了。

一个关于端口号的问题

【0,1023】:是系统内定的端口号,一般都有固定的应用层协议使用(http:80 https:443)我们要用1024及以上的端口号,同时,即便是1024以上,某些特定端口号也建议不要使用,如mysql:3306……

 用命令行:

下面是将服务器处理数据的部分分离出来的过程: 

好处:代码分层,上层就不用关心网络通信了。

二、UDP客户端

  创建套接字:

客户端不用手动bind

服务器的端口号必须是确定的(因为客户端要知道服务器的IP和端口号),而客户端只要保证唯一性就行。

用户需要传入服务器的ip和port

收发数据 

因为客户端有可能向多个服务器发起请求,那么就会有多个服务器发来响应报文,所以接收消息时,需要知道是谁发来的。

处理消息和网络通信解耦

function是C++内置的函数对象,上面这行代码定义了一个类型,func_t即一个返回值为string,参数为const string &的函数,func_t可以作为参数类型,即可将这样的一个函数作为参数传递。

也可以这样写:

三、应用场景 

1、服务端执行命令

1)建立管道

2)创建子进程,让子进程程序替换执行command

补充:127.0.0.1是本地环回地址(走了底层的网络协议栈,但并不推送到网络),通常同来进行客户端和服务器的测试 

2、Windows上的客户端

注意:WinSock2.h要在Windows.h之前

后面的代码与Linux上基本类似

3、简易聊天室

理论上是要写一个注册登录的操作的,但此处为了方便,我们就直接用ip来标识每个人

如果没有出现过这个ip,就将这个client添加到unordered_map里(相当于进群)

将消息广播:

udp的socket是全双工的,允许被同时读写

下面就来验证一下:

之前写的客户端是要发一条消息,才会收到消息,这样其实就不符合我们平时群聊的逻辑,接下来用多线程改一下:

两个线程,一个收,一个发

线程要用的数据:

补充:关于inet_ntoa

char* inet_ntoa(struct in_addr inaddr);

这个函数返回了一个char*, 很显然是这个函数自己在内部为我们申请了一块内存来保存ip的结果,man手册上说, inet_ntoa函数, 是把这个返回结果放到了静态存储区. 这个时候不需要我们手动进行释放。

但如果我们多次调用这个函数,结果会出现覆盖的情况:

在AUPE中说这个函数不是线程安全的函数,但在centos7上测试没有出现问题,可能是其内部加了互斥锁,因此推荐使用以下函数:

const char* inet_ntop(int family,const void *addrptr,char* strptr,size_t len);

四、可能遇到的问题

1、云服务器要设置安全组,开发端口号

2、登录xshell时的ip是虚拟ip,要用ifconfig指令查真正的ip

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GEE必须会教程—曾“几何”时(Geometry类型)

几何图形组成了世界万物&#xff0c;在数学史具有重要地位&#xff0c;将几何图形迁移到地理空间信息的处理上&#xff0c;我们我们得到就是研究区域的边界范围&#xff0c;因此&#xff0c;在学习矢量数据和栅格数据之前&#xff0c;我们有必要了解几何图形在GEE上的编辑。 1…

git最全总结

文章目录 Git 分布式版本控制工具内容1. 前言1.1 什么是Git1.2 使用Git能做什么 2. Git概述2.1 Git简介2.2 Git下载与安装 3. Git代码托管服务3.1 常用的Git代码托管服务3.2 码云代码托管服务3.2.1 注册码云账号3.2.2 登录码云3.2.3 创建远程仓库3.2.4 邀请其他用户成为仓库成员…

pikachu靶场-RCE

介绍&#xff1a; RCE(remote command/code execute)概述 RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 远程系统命令执行 一般出现这种漏洞&#xff0c;是因为应用系统从设计上需要给用户提供指定的远程命…

Spring篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、spring 支持集中 bean scope?二、spring bean 容器的生命周期是什么样的?三、什么是 spring 的内部 bean?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

基于springboot+vue的服装生产管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2024022502-数据库绪论

数据库绪论 数据管理的三个阶段 人工管理阶段 文件系统阶段 数据库系统阶段 基本术语 数据&#xff08;Data&#xff09; 计算机用来描述事物的记录&#xff08;文字&#xff0e;图形&#xff0e;图像&#xff0e;声音&#xff09;数据的形式本身并不能完全表达其内容&am…

新付费进群源码-带分销分站源码程序(附搭建源码+安装建设教程)

付费进群源码是由程序员创建的计算机程序的基本组成部分&#xff0c;通常以函数、描述、定义、调用、方法和其他操作语句的形式编写。它被设计为人类可读的&#xff0c;并以开发人员和其他用户可以理解的方式格式化。 付费进群源码系统要求 硬件要求&#xff1a; 需要一台运行稳…

CSRF靶场实战

DVWA靶场链接&#xff1a;https://pan.baidu.com/s/1eUlPyB-gjiZwI0wsNW_Vkw?pwd0b52 提取码&#xff1a;0b52 DVWA Low 级别打开靶场&#xff0c;修改密码 复制上面的 url&#xff0c;写个简单的 html 文件 <html <body> <a hrefhttp://127.0.0.1/DVWA/vulne…

OSCP靶场--Slort

OSCP靶场–Slort 考点(1.php 远程文件包含 2.定时任务提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.178.53 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-24 04:37 EST Nmap scan report for 192.168.178.53 …

Open CASCADE学习|几何数据结构

在几何引擎内一般把数据分成两类&#xff1a;几何信息与拓扑信息。二者可以完整地表达出实体模型&#xff0c;彼此相互独立、又互相关联。几何信息是指构成几何实体的各几何元素在欧式空间中的位置、大小、尺寸和形状信息。例如一条空间的直线&#xff0c;可以用两端点的位置矢…

【Java程序设计】【C00262】基于Springboot的会员制医疗预约服务管理系统(有论文)

基于Springboot的会员制医疗预约服务管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的会员制医疗预约服务管理信息系统&#xff0c;本系统分为三种角色&#xff1a;管理员、医生和会员&#xff1b; 在系统…

在Linux操作系统的ECS实例上安装Hive

目录 1. 完成hadoop安装配置2. 安装配置MySql安装配置 3. 安装Hive4. 配置元数据到MySQL5. hiveserver2服务配置文件测试 1. 完成hadoop安装配置 在Linux操作系统的ECS实例上安装hadoop 以上已安装并配置完jdk、hadoop也搭建了伪分布集群 2. 安装配置MySql 安装 下下一步…

c++之ini配置文件的详细解析

文章目录 ini文件概要代码实例分析小结 ini文件概要 ini文件是一种系统配置文件&#xff0c;它有特定的格式组成。通常做法&#xff0c;我们读取ini文件并按照ini格式进行解析即可。在c语言中&#xff0c;提供了模板类的功能&#xff0c;所以我们可以提供一个更通用的模板类来解…

【机器学习基础】一元线性回归(适合初学者的保姆级文章)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…

CSS 面试题汇总

CSS 面试题汇总 1. 介绍下 BFC 及其应 参考答案&#xff1a; 参考答案&#xff1a; 所谓 BFC&#xff0c;指的是一个独立的布局环境&#xff0c;BFC 内部的元素布局与外部互不影响。 触发 BFC 的方式有很多&#xff0c;常见的有&#xff1a; 设置浮动overflow 设置为 auto、scr…

【LNMP】云导航项目部署及环境搭建(复杂)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍1.1项目环境架构LNMP1.2项目代码说明 二、项目环境搭建2.1 Nginx安装2.2 php安装2.3 nginx配置和php配置2.3.1 修改nginx文件2.3.2 修改vim /etc/p…

精品基于SpringBoot的体育馆场地预约赛事管理系统的设计与实现-选座

《[含文档PPT源码等]精品基于SpringBoot的体育馆管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#…

【尚硅谷】MybatisPlus 学习笔记(下)

目录 六、插件 6.1、分页插件 6.1.1、添加配置类 6.1.2、测试 6.2、xml自定义分页 6.2.1、UserMapper中定义接口方法 6.2.2、UserMapper.xml中编写SQL 6.2.3、测试 6.3、乐观锁 6.3.1、场景 6.3.2、乐观锁与悲观锁 6.3.3、模拟修改冲突 数据库中增加商品表 添加数…

LeetCode 第一题: 两数之和

文章目录 第一题: 两数之和题目描述示例 解题思路Go语言实现 - 一遍哈希表法C实现算法分析 排序和双指针法Go语言实现 - 排序和双指针法C算法分析 暴力法Go语言实现 - 暴力法C算法分析 二分搜索法Go语言实现 - 二分搜索法C算法分析 第一题: 两数之和 ‍ 题目描述 给定一个整…