UDP协议讲解

预备知识:

端口号port:

我们在正常网络通信时,实际上是进程在互相通信。

我们所有的网络通信的行为,本质上都是进程间通信。

对双方而言,1.先保证数据能到达自己的机器 ip解决 2.找到指定的进程 端口号

ip地址用来标识互联网中唯一一台主机

端口号用来表示该指定的主机的进程的唯一性

所以ip+port={ip,port}互联网中唯一一个进程

{ip,port}我们把它叫做套接字,socket

如何理解端口号?uint16_t port

16位的数字,uint16_t port,用来标识主机的唯一的一个网络进程

为什么不直接用pid来表示网络中唯一一个进程

1.进程管理和网络管理进行解耦

2.port用来专门为网络通信

一个端口和一个进程进行关联?

一个进程可以和多个端口号关联,但是多个进程不能和一个端口号关联。

ip也可以对应多个端口号。

TCP和UDP

TCP协议:面向链接,面向字节流,可靠通信

UDP协议:面向数据报,无连接,不可靠通信

既然有了可靠通信,为什么又要设计不可靠通信

中性词,可靠通信,要得到保证就必须做更多的工作(复杂),不可靠通信,做更少的工作,很简单,丢包率也不会太高。他们之间只有不同没有好坏。

网络字节序列

在存储上我们有大端存储(大权值在低地址)和小端存储

也就是说不同机器的存储方式是不同的

我们在发数据,在内存中是以低地址到高地址发送,接收主机在内存中读取也是从低地址到高地址接收

网络规定达到网络的数据,都以大端发送,所有机器都知道数据是以大端发送的,所以小端机器就大端转化

到小端。因为主机的大小端是不一样的。

htonl:host to net int

因为port需要通过网络递送,所以得转成网络序列

socket:网路编程,socket是有很多类别的

1.unix socket :域间socket;同一台主机 的文件路径,在本主机进行通信

2.网络socket:ip+port:网络通信的文件

3.原始socket:编写一些网络工具

理论上以上三种类别都要有自己的一套接口

但是设计者只想用一套接口是一套通用的地址类型

Server服务器

创建套接字

return value;返回一个文件描述符

domain:网络通信的协议家族,也叫域

type:套接字的类型

protocol:tcp 或 udp

struct sockaddr_in local;

bzero(&lock,sizeof(local))

local.sin_family=AF_INET

local.sin_port=htons(_port)

local.sin_addr.s_addr=inet_addr(_ip)

​完成下列功能

1.四字节ip 2.网络序列

创建了socket我们要把他绑定,将它与socket关联

sockfd:socket返回的文件描述符

addr:传入sockaddr_un 或者 sockaddr_in

addrlen:结构体长度

服务器永远不退出,在Start中注定是一个死循环、

服务器接收

返回的是实际字节,len的期望收到的字节,flags默认为0(阻塞收消息)

后两个参数为输入输出型参数:给我们客户端client的信息 ip port,以后发消息就发给这个客户端

服务器发送

#pragma once
#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <unistd.h>#include <sys/types.h>
#include <sys/socket.h>#include <netinet/in.h>
#include <arpa/inet.h>#include "nocopy.hpp"
#include "Log.hpp"
#include "Comm.hpp"using namespace std;
const uint16_t defaultport = 8888;
const int defaultsocketfd = -1;
const int buffsize = 1024;class Udpserver : public nocopy
{
public:Udpserver(const uint16_t port = defaultport): _port(port), _socketfd(defaultsocketfd){}void Init(){// socket_socketfd = socket(AF_INET, SOCK_DGRAM, 0);if (_socketfd < 0){lg.LogMessage(Fatal, "socket errr, %d : %s\n", errno, strerror(errno));cout << endl;exit(socketfderror);}lg.LogMessage(Info, "socketfd success \n");cout << endl;struct sockaddr_in local;bzero(&local, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(_port);local.sin_addr.s_addr = INADDR_ANY;// bindint n = ::bind(_socketfd, (struct sockaddr *)&local, sizeof(local));if (n < 0){lg.LogMessage(Fatal, "bind error,%d : %s\n", errno, strerror(errno));cout << endl;exit(binderror);}lg.LogMessage(Info, "bind success\n");cout << endl;}void Start(){for (;;){struct sockaddr_in peer;socklen_t peerlen = sizeof(peer);char rbuff[1024];ssize_t n = recvfrom(_socketfd, rbuff, sizeof(rbuff - 1), 0, (struct sockaddr *)&peer, &peerlen);rbuff[n] = '\0';cout << "recv info:" << rbuff << endl;// if (n < 0)// {//   lg.LogMessage(Fatal, "recvfrom error,%d : %s\n", errno, strerror(errno));// }// rbuff[n]='\0';ssize_t sendn = sendto(_socketfd, rbuff, sizeof(buffsize), 0, (struct sockaddr *)&peer, peerlen);cout << "sendn success:" << rbuff << endl;if (n < 0){lg.LogMessage(Fatal, "sendto error,%d : %s\n", errno, strerror(errno));}}}~Udpserver() {}private:// string _ip;uint16_t _port;int _socketfd;
};

netstat: 查看网络连接 -anup

Client客户端

创建套接字

client需不需要绑定,一定需要,但不需要显示绑定,client向服务器第一次发送信息时会自动绑定

为什么?

server的port众所周知是不可以随意改变的,client的port是随机端口,这是由于启动客户端的进程是很多

​的,

127.0.0.1:本地循环,通常用来网络cs的测试

我们想看到客户端的信息应该如何看到?

绑定云服务器地址失败?

云服务器的公网ip是虚拟的,无法直接bind,不推荐,更推荐本地任意ip的绑定方式

如何进行服务端的任意本地ip的绑定

IP=INADDR_ANY 实现动态绑定 0.0.0.0表示任意绑定

#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <unistd.h>#include <sys/types.h>
#include <sys/socket.h>#include <netinet/in.h>
#include <arpa/inet.h>
#include "Log.hpp"
#include "Comm.hpp"
const int defaultsrecbuff = 1024;
using namespace std;
void Usage(char *argv)
{cout << "Usage:" << argv << "+ServerIp+ServerPort" << endl;
}
int main(int argc, char *argv[])
{if (argc < 3){Usage(argv[0]);cerr << "use client error" << endl;return Usage_Err;}// 创建套接字int socketfd = socket(AF_INET, SOCK_DGRAM, 0);// 填充server 发送信息string serverip = argv[1];uint16_t serverport = stoi(argv[2]);struct sockaddr_in server;bzero(&server, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(serverport);server.sin_addr.s_addr = inet_addr(serverip.c_str());while (true){string buff;cout << "#Please enter:";getline(cin, buff);int n = sendto(socketfd, buff.c_str(), buff.size(), 0,(const struct sockaddr *)&server, sizeof(server));if (n < 0){cerr << "send error" << errno << strerror(errno);break;}else{// 接收信息struct sockaddr_in peer;socklen_t peerlen = sizeof(peer);char recbuff[defaultsrecbuff];int m = recvfrom(socketfd, recbuff, sizeof(recbuff)-1, 0,(struct sockaddr *)&peer, &peerlen);if (m < 0){cerr << "rec error" << errno << strerror(errno);break;}else{recbuff[m]=0;cout << "#server say:" << recbuff << endl;}}}close(socketfd);
}

​​

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

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

相关文章

Linux部署redis保姆级教程

一、版本说明 Redis版本号&#xff08;本文的版本号是6.2.12&#xff09;的第二位如果是偶数&#xff0c;代表稳定版本&#xff0c;如果是奇数&#xff0c;代表非稳定版本。 所有历史版本下载地址&#xff1a;Index of /releases/ 二、基于压缩包安装&#xff08;推荐&#xff…

【中危】Oracle TNS Listener SID 可以被猜测

一、漏洞详情 Oracle 打补丁后&#xff0c;复测出一处中危漏洞&#xff1a;Oracle TNS Listener SID 可以被猜测。 可以通过暴力猜测的方法探测出Oracle TNS Listener SID&#xff0c;探测出的SID可以用于进一步探测Oracle 数据库的口令。 建议解决办法&#xff1a; 1. 不应该使…

RISC-V笔记——RVWMO基本体

1. 前言 RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering)&#xff0c;它是Release Consistency的扩展&#xff0c;因此&#xff0c;RVWMO的基本特性类似于RC模型。 2. RC模型 Release consistency(RC)的提出是基于一个观察&#xff1a;将所有同步操作用FENCE围在一…

机器学习:开启智能未来的钥匙

一、机器学习概述 机器学习作为人工智能的核心方法&#xff0c;通过分析数据中的隐藏规律&#xff0c;让计算机从中获取新的经验和知识&#xff0c;不断提升和改善自身性能&#xff0c;从而像人一样根据所学知识做出决策。 机器学习涉及概率论、统计学、微积分、代数学、算法…

Java | Leetcode Java题解之第495题提莫攻击

题目&#xff1a; 题解&#xff1a; class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int ans 0;int expired 0;for (int i 0; i < timeSeries.length; i) {if (timeSeries[i] > expired) {ans duration;} else {ans timeSerie…

go+bootstrap实现简单的注册登录和管理

概述 使用&#xff0c;gomysql实现了用户的登录&#xff0c;注册&#xff0c;和管理的简单功能&#xff0c;不同用户根据不同权限显示不同的内容 实战要求&#xff1a; 1、用户可以注册、登录&#xff1b; 2、登录后可以查看所有的注册的用户&#xff1b; 3、管理员操作对用…

Gin框架操作指南03:HTML渲染

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

【Petri网导论学习笔记】Petri网导论入门学习(八) —— 1.6 系统的Petri网模型

导航 1.6 系统的Petri网模型例 1.6 化学反应例 1.7 进程的通信协议例 1.8 P/V操作例 1.9 临界段互斥问题例 1.10 生产者/消费者问题例 1.11 哲学家就餐问题 1.6 系统的Petri网模型 理论的目的在于应用&#xff0c;接下来是一些关于用Petri网标识离散事件系统的例子 这里就直接…

电能表预付费系统-标准传输规范(STS)(13)

6.3 Token data elements 令牌数据元素 6.3.1 Data elements used in tokens 使用在令牌上的数据元素 The data elements given in Table 1 3 are used in tokens in various combinations and are all encoded in binary format. 表13中给出的数据元素以各种组合用于令牌中&…

DISTINCT 去重

1. 单字段去重 以表 student_course 和 表 student 链接为例&#xff1a; SELECT * FROM student_course a INNER JOIN student b ON a.student_idb.id;查询结果如下图&#xff1a; 上图查询结果中&#xff0c;若只需要学生信息&#xff0c;则需要对结果进行去重&#xff1a;…

从零开始学PHP之helloworld

前言 每一门编程语言的第一个程序就是输出hell world&#xff08;别杠&#xff0c;杠就是你对&#xff09; 开始 上一篇讲完了开发环境的安装&#xff0c;这次讲编辑器的安装&#xff0c;顺带完成上一篇的作业&#xff08;输出hello world&#xff09; 安装PHPstorm 我用的…

分布式介绍

CAP理论 CAP理论是分布式架构中提出来的一种设计思想模型&#xff0c;全称是由Consistency、Availability、Partition Tolerance三个词组成。 C(Consistency&#xff0c;一致性):总能读到最新的写操作的结果A(Availability&#xff0c;可用性):每个请求都要在合理的时间内给出…

如何将本地 Node.js 服务部署到宝塔面板:完整的部署指南

文章简介&#xff1a; 将本地开发的 Node.js 项目部署到线上服务器是开发者常见的工作流程之一。在这篇文章中&#xff0c;我将详细介绍如何将本地的 Node.js 服务通过宝塔面板&#xff08;BT 面板&#xff09;上线。宝塔面板是一个强大的服务器管理工具&#xff0c;具有简洁的…

使用 Go 语言实现 WebSocket的核心逻辑

文章目录 WebSocket 简介时序图核心逻辑Client 结构与功能创建新客户端消息读取逻辑 (ReadPump)发送消息逻辑 (Send)客户端管理器 (ClientManager)WebSocket 处理器处理心跳与长连接 总结 本文将基于 Go 语言&#xff0c;通过使用 gorilla/websocket 库来实现一个简单的聊天应用…

教电脑“看”图片

教电脑“看”图片 计算机视觉简介 上一篇&#xff1a;《自己DIY首个人工智能模型》 序言&#xff1a;人是如何“看”图片的&#xff1f;人类感知周围世界&#xff0c;主要依赖看、听、闻、触这些感官&#xff0c;而“看”是最普遍和直观的方式。计算机视觉&#xff0c;就是对…

前端html,css 样式巩固1

想做这样 一个效果 点击图片切换 当前的选中图片 我们使用 原生的js html 来开发这个 直接粘贴代码 相信大家 都能看懂的 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" …

力扣动态规划基础版(斐波那契类型)

70. 爬楼梯https://leetcode.cn/problems/climbing-stairs/ 70.爬楼梯 方法一 动态规划 考虑转移方程和边界条件&#xff1a; f&#xff08;x&#xff09; f&#xff08;x -1&#xff09; f&#xff08;x - 2&#xff09;;f&#xff08;1&#xff09; 1&#xff1b;f&…

CNN-BiLSTM回归预测 | MATLAB实现CNN-BiLSTM卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiLSTM(卷积双向长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现CNN-BiLSTM(卷积双向长短期记忆神经网络)多输入单输出效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 提出一种同时考虑时间与空间因素的卷积-双向长短期记…

UART协议

文章目录 UART 协议主要特点UART控制器组成部分工作流程 UART寄存器(fs4412)输入输出重定向 UART 协议 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发传输器&#xff09;是一种串行通信协议&#xff0c;用于在计算机或外设之间进行数…

java集合进阶篇-《Collection集合》

个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、Collection集合简要概述 Collection的主要实现 Collection的方法 迭代器&#xff08;Iterator&#xff09; 三、单列集合顶层接口Collection CollectionDemo01 CollectionDemo02 CollectionDemo03 Collec…