点分十进制字符串IP 转 32位网络序列IP

分析:1)IP转成4字节        2)4字节转成网络序列

思路:

  • "192.168.1.1" 进行字符串划分,以 "." 为分割符,分割出"192","168","1","1"
  • 将这些字符串转成8位的整型(字符),192,168,1,1
  • 网络字节序是大端,高权值位放在低地址,定义一个32位整型(变量内字节地址是依次增大,取地址是最小地址),192放取地址的第一个字节,168第二个字节,以此类推。

或者用 inet_addr(),将ip点分十进制字符串传入,返回值4字节网络字节序。

接口使用

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

  • sockfd:创建套接字打开的文件fd
  • buf:接受缓冲区
  • len:接受缓冲区大小
  • flags:0,表示阻塞式IO
  • src_addr:输出型参数,用来获取客户端的套接字信息(IP和端口)
  • addrlen:先是输入型参数,src_addr指向结构体大小,后是输出型参数,实际读到信息大小
  • 返回值:成功,返回接受到数据的字节数;失败-1返回

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

  • sockfd:创建套接字打开的文件fd
  • buf:发送缓冲区
  • len:发送缓冲区大小
  • flags:0,表示阻塞式IO
  • src_addr:输入型参数,指定发给哪一个客户端
  • addrlen:src_addr指向的结构体大小
  • 返回值:成功,发送的字节数;失败-1返回,错误码被设置

客户端如何知道服务端IP和端口

客户端和服务端是一家公司写的,内置了服务端的IP和端口

本地环回(localhost, 127.0.0.1)

        本地环回:要求客户端和服务端必须在一台机器上,表明我们是本地通信,client发送的数据,不会被推送到网络,而是在OS内部,转一圈直接交给对应的服务器端(经常用来进行网络代码的测试)

服务端bind时不显式绑定IP

bind公网IP,不行的原因:公网IP没有配置到IP上,同一主机绑定时,无法直接bind。

如果我们显式进行地址绑定,client未来访问时,就必须使用server绑定的信息。

为什么不建议手动绑定特定IP?

        因为一台主机可以有多个IP,绑定特定IP,只能接受该IP的数据,而发给其他本主机IP的数据接收不了。

做法:绑定IP时,值设置为 INADDR_ANY(任意IP地址bind,数值上为0)

客户端不用显式bind

  • client需不需要bind?需要bind
  • client需不需要显式bind?不需要,首次发送消息OS会自动给client进行bind,OS知道IP,端口号采用随机端口号的方式。(端口号是几不重要,唯一就行了)
  • 原因:
    1. 一个端口号只能被一个进程所持有(端口号要找到唯一一个进程)
    2.未来有很多应用,端口号固定可能会导致冲突,无法bind,必须由OS随机分配

UdpSocket编程V1(EchoServer)

Linux-remote: linux远程仓库

UdpServer.hpp

#pragma once#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <functional>
#include "Log.hpp"using namespace LogModule;#define BUFF_SIZE 1024
const int defaultfd = -1;class UdpServer
{using func_t = std::function<std::string(const std::string &)>;
public:UdpServer(uint16_t port, func_t func): _sockfd(defaultfd), _port(port), _isrunning(false), _func(func){// 1.创建套接字,(网络类型,UDP协议)获取网络文件描述符_sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (_sockfd < 0){LOG(LogLevel::FATAL) << "socket error";exit(1);}LOG(LogLevel::INFO) << "socket success, sockfd: " << _sockfd;// 2.bind,绑定(通信类型,端口号port,IP)// 2.1 创建结构sockaddr_in, (man inet_addr),填充字段struct sockaddr_in peer;peer.sin_family = AF_INET;peer.sin_port = htons(_port);// 2.2 ip地址是一个结构,结构存放一个32位无符号整数// ip是一个字符串,192.168.1.1, 1.转成数字 2.转成网络序列 -> inet_addr// peer.sin_addr.s_addr = inet_addr(_ip.c_str());peer.sin_addr.s_addr = INADDR_ANY; // 任意IP// 2.3 绑定int n = bind(_sockfd, (struct sockaddr *)&peer, sizeof(peer));if (n < 0){LOG(LogLevel::FATAL) << "bind error";exit(2);}LOG(LogLevel::INFO) << "bind success, sockfd: " << _sockfd;}void Start(){_isrunning = true;while (_isrunning){// 3.服务端收数据char buff[BUFF_SIZE];struct sockaddr_in peer;socklen_t addrlen = sizeof(struct sockaddr_in);ssize_t n = recvfrom(_sockfd, buff, BUFF_SIZE, 0,(struct sockaddr *)&peer, &addrlen);// 4.消息处理buff[n] = 0;std::string data = buff;LOG(LogLevel::INFO) << "client Says: " << data;std::string result = _func(data);// 5.服务端发送数据回客户端ssize_t ret = sendto(_sockfd, result.c_str(), result.size(), 0, (const struct sockaddr *)&peer, addrlen);(void)ret;}}~UdpServer(){}private:int _sockfd;uint16_t _port;// std::string _ip;  //不需要,任意IPbool _isrunning;func_t _func;
};

UdpClient.cc

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Log.hpp"using namespace LogModule;// ./udpclient server_ip server_port
int main(int argc, char *argv[])
{if (argc != 3){std::cerr << "Usage: " << argv[0] << " server_ip server_port" << std::endl;return 1;}std::string ip = argv[1];uint16_t port = (uint16_t)(std::stoi(argv[2]));LOG(LogLevel::DEBUG) << "ip: " << ip << " port:" << port;// 1.创建socket,(网络类型,UDP)int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){LOG(LogLevel::FATAL) << "socket error";exit(1);}LOG(LogLevel::INFO) << "socket success, sockfd: " << sockfd;// 2.绑定参数,bind,不用显式绑定。// 首次发送消息时由OS自动绑定,OS知道IP,端口号由OS随机分配struct sockaddr_in peer;peer.sin_family = AF_INET;peer.sin_port = htons(port);peer.sin_addr.s_addr = inet_addr(ip.c_str());while (true){// 3.客户端发数据// 3.1 从标准输入按行读数据std::cout << "Please Enter# ";std::string data;std::getline(std::cin, data);// 3.2 发送数据给服务端ssize_t ret = sendto(sockfd, data.c_str(), data.size(), 0, (struct sockaddr *)&peer, sizeof(peer));(void)ret;// 4.接受服务端处理过的数据char buff[1024];struct sockaddr_in sin;socklen_t len = sizeof(struct sockaddr_in);ssize_t n = recvfrom(sockfd, buff, 1024, 0, (struct sockaddr *)&sin, &len);// 5.使用数据buff[n] = 0;std::cout << "Server handlered, data: " << buff << std::endl;}return 0;
}

UdpServer.cc

#include "UdpServer.hpp"
#include <iostream>
#include <memory>std::string Hello(const std::string &data)
{std::string hello("Hello, ");hello += data;return hello;
}// ./udpserver port
int main(int argc, char *argv[])
{if (argc != 2){std::cerr << "Usage: " << argv[0] << " port" << std::endl;return 1;}uint16_t port = (uint16_t)std::stoi(argv[1]);std::unique_ptr<UdpServer> udpserver = std::make_unique<UdpServer>(port, Hello);udpserver->Start();return 0;
}

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

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

相关文章

Redis的持久化工具包—RDB AOF

文章目录 前言 一、RDB 持久化&#xff08;快照持久化&#xff09; 1. 定义 2. RDB 触发机制 &#xff08;1&#xff09;手动触发 &#xff08;2&#xff09;自动触发 3. RDB 持久化流程 4. RDB 核心配置 5. RDB 优缺点 二、AOF 持久化&#xff08;日志持久化&#xff09; 1. 定…

【Web安全】XXL-JOB框架SRC高频漏洞分析总结

文章目录前言一、核心漏洞分类与技术细节二、漏洞关联利用与攻击路径三、版本演进与修复策略四、安全运维建议五、典型漏洞复现环境搭建六、总结前言 XXL-JOB是国内主流的开源分布式任务调度框架&#xff0c;由徐雪里开发维护&#xff0c;以轻量易用、高可用、适配分布式场景等…

Capacitor 打包后接口访问不到的排查经历

我最近在用 Quasar Capacitor 6 做一个 Android App&#xff0c;前端用的是 Vue3 Quasar&#xff0c;打包交给 Capacitor 去跑在手机的 WebView 里&#xff0c;后端是 FastAPI 提供接口。开发模式下一切顺利&#xff0c;浏览器里访问接口没有任何问题&#xff0c;我甚至觉得打…

【正点原子】Linux应用编程入门~概念及环境介绍

应用编程概念 应用编程&#xff08;也可称为系统编程&#xff09;与驱动编程、裸机编程有何不同&#xff1f;系统调用&#xff1b;何为库函数&#xff1b;应用程序的 main()函数&#xff1b;应用程序开发环境的介绍&#xff1b;系统调用 定义系统调用&#xff08;system call&a…

一、HTML 完全指南:从零开始构建网页

文章目录前言一、 HTML 结构认识 HTML 标签HTML 文件基本结构标签层次结构快速生成代码框架二、 HTML 常见标签详解2.1 注释标签2.2 标题标签 (h1 - h6)2.3 段落标签 (p)2.4 换行标签 (br)2.5 格式化标签2.6 图片标签 (img)2.7 超链接标签 (a)2.8 表格标签基本使用合并单元格2.…

基于POI-TL实现动态Word模板的数据填充:【散点图】特殊处理方案

基于POI-TL实现动态Word模板的数据填充:散点图特殊处理方案 在使用POI-TL进行Word模板动态数据填充时,图表生成是一个常见需求。最近在项目中使用POI-TL处理散点图时遇到了一个特殊问题,经过研究后找到了解决方案,特此记录分享。 问题背景 POI-TL作为一款优秀的Java Wor…

使用node-Express框架写一个学校宿舍管理系统练习项目-前后端分离

今天继续分享一个新的练习项目&#xff0c;是使用node做为后端语言&#xff0c;来写的一个前后端分离项目&#xff1a;学校宿舍管理系统。我们如果想掌握一门编程语言&#xff0c;就是需要大量的练习。所以当我们学习到了一些知识&#xff0c;自己想一下 可以拿学到的知识&…

Kafka 运维实战基本操作含命令与最佳实践

1. 基础概览与工具入口 Kafka 发行包的所有 CLI 工具均在 bin/ 目录下。任何工具不带参数运行都会显示所有可用选项。本文命令默认&#xff1a;--bootstrap-server localhost:9092&#xff1b;生产请替换为你的控制面或内网 VIP。 2. 主题管理&#xff08;创建 / 修改 / 删除 /…

贪心算法应用:航班起降问题详解

Java中的贪心算法应用&#xff1a;航班起降问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致全局最优解的算法策略。在航班起降问题中&#xff0c;贪心算法可以有效地解决机场跑道调度问题&#xff0c;即如何安排航班的起降顺序以最大…

uniapp scroll-view 设置scrollTop无效

当我们使用 scroll-view的scroll-top的时候 默认想让它回到顶部&#xff0c;当我们设置值为0的时候会不生效&#xff0c;在实际运用过程中&#xff0c;发现设置了scroll-top无效&#xff0c;滚动条位置并没有发生变化&#xff0c;是因为微信小程序的官方框架处于性能考虑&#…

网络与通信

1.TCP协议与UDP协议TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;和 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是 TCP/IP 协议族中两种核心的传输层协议&#xff0c;它们在数据传输方式、可靠性、适…

Node.js中package.json详解

1. name&#xff08;名称&#xff09; 如果你计划发布你的包&#xff0c;package.json 中最重要的字段是 name 和 version&#xff0c;因为它们是必需的。name 和 version 共同组成一个假定完全唯一的标识符。包的更改应伴随版本号的更新。如果你不打算发布包&#xff0c;那么…

代码随想录第14天| 翻转、对称与深度

226.翻转二叉树 &#xff08;优先掌握递归&#xff09; 题目链接/文章讲解/视频讲解&#xff1a;翻转二叉树 交换的是指针&#xff0c;而不是数值&#xff0c;如果用数值做交换&#xff0c;需要交换的节点下面无法很好的操作。 使用递归来实现&#xff0c;但要提前清除是什么顺…

DNS-Windows上使用DNS

DNS-Windows上使用DNS一、查看与修改DNS配置1.1、查看当前DNS服务器设置1.2、临时修改 DNS 服务器&#xff08;命令行&#xff09;二、DNS缓存相关操作2.1、查看DNS缓存内容2.2、 刷新 DNS 缓存&#xff08;清除过期记录&#xff09;三、测试域名解析&#xff08;nslookup 工具…

3dsMax 2026 .NET Core 8 转型下的Maxscript脚本开发:动态编译模块的重构策略与兼容性升级路径

3ds Max 长期以来一直提供出色的 .NET 集成,使 Maxscript 能够无缝利用任何 .NET 库的强大功能。部分开发者在工具中广泛使用了 .NET 功能。 之前,3ds Max 依赖于 .NET Framework 4.8 并且最近更新到了 4.8.1,用于 2025 版本的发布。然而,随着 3ds Max 2026 的推出,Autod…

golang 做webrtc开发核心

在Golang中进行WebRTC开发&#xff0c;核心在于理解WebRTC协议的工作原理以及如何利用Go生态中的库来实现关键功能。以下是Golang WebRTC开发的核心要点&#xff1a; WebRTC基础概念 了解ICE&#xff08;Interactive Connectivity Establishment&#xff09;协议用于NAT穿越掌握…

RabbitMQ 异步化抗洪实战

说明&#xff1a;本文仅展示架构思路与安全片段&#xff0c;所有敏感字段已用占位符&#xff1b;不含可直接复刻的生产细节。数据与接口均为演示/虚拟。0. 背景与目标长耗时/不确定接口&#xff08;如对接第三方机器人平台&#xff09;的同步阻塞&#xff0c;容易造成请求堆积与…

接口返回 2 万条数据,easy-trans导致多了20s耗时排查过程

内网访问排版核料详情功能&#xff0c;用户反馈要等十几秒排查 sql&#xff1a;sql 比较简单排查内存计算&#xff1a;arthus trace 类名 方法名 总耗时2s排查页面渲染是否缓慢&#xff1a;F12 查看接口 等待服务器响应 20s 下载时间 30s, 故不考虑渲染问题排查请求响应日志打…

AIGC入门,手搓大模型客户端与MCP交互

概述 在现代应用开发中&#xff0c;将大语言模型&#xff08;LLM&#xff09;与专用工具服务相结合&#xff0c;可以构建出既能理解自然语言&#xff0c;又能准确执行专业任务的智能代理。本文介绍一个基于 MCP&#xff08;Model Context Protocol&#xff09;协议和 Ollama 本…

深度学习:从预备知识到未来展望

在当今数字化时代&#xff0c;深度学习正以前所未有的速度改变着我们的生活和工作方式。从智能语音助手到自动驾驶汽车&#xff0c;从精准医疗到个性化推荐系统&#xff0c;深度学习的应用无处不在。本文将从深度学习的预备知识入手&#xff0c;探讨其发展历程、关键技术和未来…