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://xiahunao.cn/news/2807297.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Visual Studio:Entity设置表之间的关联关系

1、选择表并右键-》新增-》关联 2、设置关联的表及关联关系并“确定”即可

基于Docker和Springboot两种方式安装与部署Camunda流程引擎

文章目录 前言1、Docker安装1.1、拉取Camunda BPM镜像1.2、编写docker启动camunda容器脚本1.3、docker启动脚本1.4、访问验证 2、SpringBoot启动2.1、下载地址2.2、创建SpringBoot项目并配置基础信息2.3、下载SpringBoot项目并在idea中打开2.4、pom修改2.5、application.yml配置…

软件实例,物流货运配货单打印模板软件单据打印查询管理系统软件教程,可以同时打印标签或补打

软件实例&#xff0c;物流货运配货单打印模板软件单据打印查询管理系统软件教程&#xff0c;可以同时打印标签或补打 一、前言 以下软件教程以 佳易王物流单打印查询系统V17.1为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 这个版本在原来基…

PyTorch概述(五)---LINEAR

torch.nn.Linear torch.nn.Linear(in_features,out_features,biasTrue,deviceNone,dtypeNone) 对输入的数据应用一个线性变换&#xff1a; 该模块支持TensorFLoat32类型的数据&#xff1b;在某些ROCm设备上&#xff0c;使用float16类型的数据输入时&#xff0c;该模块在反向传…

C++面试题精选与解析

C面试题精选与解析 一、基础与语法 请问C中的指针和引用有什么区别&#xff1f; 指针是一个变量&#xff0c;存储的是另一个变量的内存地址。指针可以被重新赋值以指向另一个不同的对象。而引用是某个变量的别名&#xff0c;一旦引用被初始化为一个变量&#xff0c;就不能改变…

Java 学习和实践笔记(20):static的含义和使用

static的本义是静止的。在计算机里就表示静态变量。 在Java中&#xff0c;从内存分析图上可以看到&#xff0c;它与类、常量池放在一个区里&#xff1a; 从图可以看到&#xff0c;普通的方法和对象属性&#xff0c;都在heep里&#xff0c;而static则在方法区里。 static声明的…

数据结构-查找与排序

数据结构再往后就是比较零散的各种操作&#xff0c;查找与排序是其中最常出现的&#xff0c;今天来总结一下常用的查找与排序所用的方法 查找 顺序查找 最简单的查找方式&#xff0c;遍历&#xff0c;然后比较 bool search1(int *a,int n,int k){for (int i1;i<n;i){//遍…

Guitar Pro8.2吉他软件2024中文版功能特点介绍

Guitar Pro 8.2是一款功能强大的吉他乐谱软件&#xff0c;专为吉他手、音乐制作人和音乐爱好者设计。它提供了丰富的功能&#xff0c;帮助用户轻松创建、编辑、打印和分享吉他乐谱。以下是Guitar Pro 8.2的主要功能特点&#xff1a; Guitar Pro 2024 win-安装包下载如下&#x…

【Redis】常见的5种数据类型(上)

文章目录 1 :peach:前言:peach:2 :peach:Redis 基本的全局命令:peach:2.1 :apple:keys:apple:2.2 :apple:exists:apple:2.3 :apple:del:apple:2.4 :apple:expire:apple:2.5 :apple:ttl:apple:2.6 :apple:type:apple: 3 :peach:单线程架构:peach:4 :peach:Redis 的 5 种常见数据…

Java面试题之Redis

Redis相关面试题解 题一&#xff1a;RDB 和 AOF 机制的优缺点RDB&#xff1a;Redis DataBaseAOF&#xff1a;Append Only File 题二&#xff1a;Redis的过期键的删除策略惰性过期定期过期 题三&#xff1a;Redis线程模型、单线程快的原因题四&#xff1a;简述Redis事务实现1、事…

【Java程序员面试专栏 数据结构】六 高频面试算法题:字符串

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊数组,包括数组合并,滑动窗口解决最长无重复子数组问题,图形法解下一个排列问题,以及一些常见的二维矩阵问题,所以放到一篇Blog中集中练习 题目…

LeetCode LCR 085.括号生成

正整数 n 代表生成括号的对数&#xff0c;请设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&#xff1a; 输入&#x…

5.1 Ajax数据爬取之初介绍

目录 1. Ajax 数据介绍 2. Ajax 分析 2.1 Ajax 例子 2.2 Ajax 分析方法 &#xff08;1&#xff09;在网页页面右键&#xff0c;检查 &#xff08;2&#xff09;找到network&#xff0c;ctrl R刷新 &#xff08;3&#xff09;找 Ajax 数据包 &#xff08;4&#xff09;…

python-mysql协程并发常用操作封装

目录 前言封装代码测试代码参考 前言 协程异步操作MYSQL是常用的&#xff0c;博主这里在GitHub上找了两个包&#xff0c;databases和aiomysql&#xff0c;第一个包除了mysql外还支持其他的数据库&#xff0c;且操作MYSQL时底层也是使用的aiomysql&#xff0c;但文档内容比较少…

Kodi设置界面语言为中文

Kodi设置界面语言为中文需要注意的一点就是&#xff0c;先要设置&#xff1a;皮肤&#xff08;Skin&#xff09;---》字体&#xff08;Fonts&#xff09;---》基于Arial字体&#xff08;Arial based&#xff09;&#xff0c;否则在设置后&#xff1a;区域&#xff08;Regional&…

OD(10)之Mermaid甘特图(Gantt diagrams)使用详解.md

OD(8)之Mermaid甘特图(Gantt diagrams)使用详解 Author: Once Day Date: 2024年2月24日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting to…

OpenCV Mat实例详解 六

本文将接着OpenCV Mat实例详解继续介绍OpenCV Mat类的操作符及公有成员函数。 Mat & operator Mat & operator (const Mat &m) 将一个Mat对象赋值个另一个Mat对象。 Mat & operator (const MatExpr &expr) 将一个Mat表达式值赋值给Mat对象 Mat & op…

StarRocks——滴滴OLAP的技术实践与发展方向

原文大佬的这篇StarRocks实践文章整体写的很深入&#xff0c;介绍了StarRocks数仓架构设计、物化视图加速实时看板、全局字典精确去重等内容&#xff0c;这里直接摘抄下来用作学习和知识沉淀。 目录 一、背景介绍 1.1 滴滴OLAP的发展历程 1.2 OLAP引擎存在的痛点 1.2.1 运维…

ArcgisForJS如何将ArcGIS Server发布的点要素渲染为热力图?

文章目录 0.引言1.ArcGIS创建点要素2.ArcGIS Server发布点要素3.ArcgisForJS将ArcGIS创建的点要素渲染为热力图 0.引言 ArcGIS For JS 是一个强大的地理信息系统&#xff08;GIS&#xff09;工具&#xff0c;它允许开发者使用 JavaScript 语言来创建各种 GIS 应用。ArcGIS Ser…

深入探究Python多进程编程:Multiprocessing模块基础与实战【第98篇—Multiprocessing模块】

深入探究Python多进程编程&#xff1a;Multiprocessing模块基础与实战 在Python编程中&#xff0c;多进程处理是一项关键的技术&#xff0c;特别是在需要处理大规模数据或执行耗时任务时。为了充分利用多核处理器的优势&#xff0c;Python提供了multiprocessing模块&#xff0…