1.创建套接字

int socket(int domain, int type, int protocol);
第一个参数,底层用的ip报文统一使用的网络协议都是AFIN
第二个参数,面向流的传输协议
SOCK_DGRAM(数据报套接字类型):支持数据报(无连接、不可靠且具有固定最大长度的消息 )
第三个参数,设置为0
创建成功返回一个文件描述符,创建失败返回-1

2.绑定socket信息,ip和端口

2.1 填充sockaddr_in 结构体

        IP信息和端口信息一定要发送到网络
         

(1)本地格式转化成网序列

   
local.sin_port = htons(_port);
将本地字节序(也叫主机字节序 )的端口号,转换为网络字节序(大端序 高字节存低地址,低字节存高地址),从而让端口号能在网络通信中正确识别和传输
eg:主机是小端序(如常见的 x86 架构 ),_port 的值是 8080(十进制 ),在主机内存中以小端序存储(低字节在前 ),二进制可能表示为 0x1F 0x20(十六进制拆分 )。经过 htons 转换后,会变成大端序的 0x20 0x1F ,然后赋值给 local.sin_port ,满足网络字节序要求

(2)ip也是一样

1. ip转化为4字节
2. 4字节转化为网络序列
1.点分十进制 -> 4字节二进制(主机字节序)
eg:IP 地址 192.168.1.100
192 -> 11000000
168 -> 10101000
1     ->  00000001
100 ->  01100100
得到32位二进制  (4字节)
11000000 10101000 00000001 01100100
2. 4字节 -> 大端序
就能存到 sockaddr_in 结构体的 sin_addr.s_addr 成员里,供网络操作使用
local.sin_addr.s_addr = inet_addr(_ip.c_str());
函数申明 in_addr_t inet_addr(const char *cp);
在实际编程中,我们不需要手动写 in_addr_t inet_addr(const char *cp); 这个声明,而是通过包含头文件 #include <arpa/inet.h> 来获取该函数的声明
函数调用  local.sin_addr.s_addr = inet_addr(_ip.c_str());
local.sin_addr.s_addr = inet_addr("192.168.1.100");
不管是内网还是公网的客户端,都能访问到服务,就可以用 INADDR_ANY ,不用关心具体绑定哪个 IP

INADDR_ANY 的核心作用就是让服务器「绑定到本机所有可用的网络接口」,从而实现:

无论客户端通过服务器的公网 IP、内网 IP 还是本地回环地址(127.0.0.1) 发送请求,只要端口正确,服务器都能接收到。
无需提前知道服务器有哪些 IP 地址(比如服务器可能有多个网卡,或 IP 是动态分配的),简化配置

recvfrom 和 sendto 函数

服务器要显示bind,ip和端口号必须是众所周知且不能轻易改变的
1. 收消息,客户端要给服务器发消息,为了让服务端处理数据
recvfrom 接收数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

client的bind

client要访问目标服务器,需要知道服务器ip和端口,而客户端和服务器是同一家公司写的,就能知道
客户端需要bind即使是客户端,发送数据时也需要一个「源端口」,让服务器能通过 recvfrom 获取客户端的端口。但不要显示地bind,首次发消息,os会自动给client进行bind,os知道ip,os随机选择端口号,只要端口号是唯一的就可以

(1)服务端必须「显式绑定」
服务端需要一个固定、已知的端口(比如 80、8080),让客户端能主动连接。因此必须手动 bind:

(2)客户端可以「隐式绑定」
客户端不需要固定端口(端口由系统自动分配),因此可以省略 bind 操作。当客户端第一次调用 sendto 或 recvfrom 时:

操作系统会自动为客户端分配一个随机的空闲端口(通常在 1024~65535 范围内)
同时自动绑定客户端的 IP(通常是本机 IP,如 192.168.1.100)


操作系统会自动完成以下步骤:

检查客户端套接字是否已绑定端口:
如果未绑定,进入「自动绑定流程」。
分配随机端口:
从 1024~65535 中选一个未被占用的端口(类似临时端口分配)。
绑定客户端 IP:
自动绑定到客户端的「默认出网 IP」(可能是 127.0.0.1 或本机真实 IP,由路由策略决定)


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

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

相关文章

计算机网络:如何判断B或者C类IP地址是否划分了子网

要判断B类或C类IP地址是否划分了子网,核心在于通过子网掩码分析其网络位长度是否超过该类地址的默认网络位长度。以下是具体的判断方法和细节说明: 一、基础概念:IP地址类别与默认网络位 IP地址分为A、B、C三类(常用),每类地址的默认网络位长度(即未划分子网时,用于标…

智慧农业温室大棚物联网远程监控与智能监测系统

一、痛点破局&#xff1a;从“靠天吃饭”到“知天而作”传统温室大棚管理依赖人工巡检与经验判断&#xff0c;存在三大核心痛点&#xff1a;数据孤岛&#xff1a;温湿度、光照、CO₂浓度等关键参数分散于不同设备&#xff0c;难以实时整合分析&#xff1b;响应滞后&#xff1a;…

PID学习笔记1

在学习江协科技PID课程时&#xff0c;做一些笔记&#xff0c;对应视频1-4&#xff0c;对应代码&#xff1a;02&#xff0c;03&#xff0c;04&#xff0c;0502-位置式PID定速控制main.c:#include "stm32f10x.h" // Device header #include "Del…

C++入门学习3

10.类和对象 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 C中定义类&#xff08;结构体&#xff09;的语法&#xff1a; class className {// 类体&#xff1a;由成员函数和成员变量组成}; // 一定要注意…

奇偶校验码原理与FPGA实现

奇偶校验原理与FPGA实现写在前面一、基础原理2.1 奇校验2.2 偶校验2.3 缺点二、举个例子3.1 奇校验例子3.2 偶校验例子3.3 检测出错例子三、FPGA实现写在后面写在前面 奇偶校验码是一种简单的检错码&#xff0c;主要用于数据传输或存储过程中检测奇数个比特错误或者偶数个比特错…

Python中的Lambda函数详解

Lambda函数&#xff08;匿名函数&#xff09;是Python中一种简洁的函数定义方式&#xff0c;它允许你快速创建小型、一次性的函数对象而无需使用标准的def关键字。1. Lambda函数的基本语法lambda arguments: expressionlambda&#xff1a;定义匿名函数的关键字arguments&#x…

进阶向:Python编写网页爬虫抓取数据

Python网页爬虫入门指南&#xff1a;从零开始抓取数据在当今数据驱动的时代&#xff0c;网络爬虫已成为获取公开信息的重要工具。Python凭借其丰富的库和简洁的语法&#xff0c;成为编写网络爬虫的首选语言。本文将详细介绍如何使用Python编写一个基础的网页爬虫。什么是网页爬…

客服Agent革命:智能客服系统的技术实现与效果评估

客服Agent革命&#xff1a;智能客服系统的技术实现与效果评估 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;每一个特性都是我…

C++-红黑树

1、红黑树的概念红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;…

在Python中避免使用`None`表示特殊情况:函数返回值与异常处理的最佳实践 (Effective Python 第20条)

在Python编程中&#xff0c;函数的设计与实现直接影响代码的可读性、可维护性和健壮性。一个常见的问题是如何处理函数的返回值&#xff0c;尤其是在需要表示某种特殊或异常情况时。许多开发者习惯性地使用None来表示这些特殊情况&#xff0c;但这种方法往往会导致意想不到的错…

从反射到方法句柄:深入探索Java动态编程的终极解决方案

&#x1f31f; 你好&#xff0c;我是 励志成为糕手 &#xff01; &#x1f30c; 在代码的宇宙中&#xff0c;我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光&#xff0c;在逻辑的土壤里生长成璀璨的银河&#xff1b; &#x1f6e0;️ 每一个算法都是我绘制…

算法_python_学习记录_01

人心的成见是一座大山。一旦有山挡在面前&#xff0c;则很难到达下一站。所需要做的&#xff0c;是穿过这座山。 偶然间看了一个视频&#xff0c;说的是EMASMA的自动交易策略&#xff0c;这个视频做的很用心&#xff0c;在入场的时间不仅要看EMA的金叉&#xff0c;还需要看其他…

机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)

文章目录一、语法&#xff08;Grammar&#xff09;&#xff1a;语言规则的底层框架1.1 传统语法理论的应用1.2 生成语法&#xff08;Generative Grammar&#xff09;1.3 依存语法&#xff08;Dependency Grammar&#xff09;二、句法&#xff08;Syntax&#xff09;&#xff1a…

MQTT:Dashboard访问授权

目录一、认证1.1 创建认证器1.2 多认证器二、授权2.1 ACL文件授权配置2.2 使用内置数据库授权配置一、认证 认证&#xff1a;就是验证客户端的身份。 1.1 创建认证器 选择认证方式配置数据源配置数据源的相关参数 认证器创建之后&#xff0c;在使用客户端连接Dashboard时&am…

Serper注册无反应

google邮箱才行&#xff0c;163邮箱注册无反应&#xff0c;其他邮箱没试过 在尝试websailor系列的时候&#xff0c;需要注册serper&#xff0c;获取Google Search Key serper.dev/dashboard

聊聊经常用的微服务

聊聊微服务 架构演变 单体架构&#xff1a; All in One&#xff0c;所有的功能模块都在一个工程里。 SOA架构&#xff1a; 这个架构当不当正不正&#xff0c;对于现在来说&#xff0c;有点老&#xff0c;甚至需要ESB&#xff0c;WebService之类的&#xff0c;基本不会使用了。…

第十四届蓝桥杯青少年组省赛 编程题真题题解

明天我就要考蓝桥杯省赛了&#xff0c;本蒟蒻已瑟瑟发抖&#xff0c;所以现在写一篇文章。 题目分别为&#xff1a; 1.​​​​​​B4270 [蓝桥杯青少年组省赛 2023] 特殊运算符 2.B4271 [蓝桥杯青少年组省赛 2023] 四叶玫瑰数 3.B4272 [蓝桥杯青少年组省赛 2023] 质因数的…

HTML全景效果实现

我将为您创建一个精美的360度全景效果页面&#xff0c;使用Three.js库实现沉浸式全景体验&#xff0c;并提供用户友好的控制界面&#xff0c;完整代码看文章末尾。 设计思路 使用Three.js创建全景球体 添加控制面板用于切换不同场景 实现自动旋转和手动控制选项 添加加载状…

Python 属性描述符(描述符用法建议)

描述符用法建议 下面根据刚刚论述的描述符特征给出一些实用的结论。 使用特性以保持简单 内置的 property 类创建的其实是覆盖型描述符&#xff0c;__set__ 方法和 __get__ 方法都实现了&#xff0c;即便不定义设值方法也是如此。特性的 __set__ 方法默认抛出 AttributeError: …

Milvus 向量数据库内存使用相关了解

1、支持 MMap 的数据存储在 Milvus 中&#xff0c;内存映射文件允许将文件内容直接映射到内存中。这一功能提高了内存效率&#xff0c;尤其是在可用内存稀缺但完全加载数据不可行的情况下。这种优化机制可以增加数据容量&#xff0c;同时在一定限度内确保性能&#xff1b;但当数…