IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP IP地址和端口号设置 -> 正文阅读

[网络协议]TCP IP地址和端口号设置

1.大小端模式

1. 大端模式:低地址存储高字节
? ??小端模式:低地址存储低字节

2.网络传输统一使用大端模式作为网络字节序,而计算机大多数为小端模式

3.大小端转化函
(1)头文件? ? ?#include <arpa/inet.h>
(2)函数?
????????uint32_t htonl(uint32_t hostlong);? ? ? ?//主机字节序转化为网络字节序 long 类型

??????? uint16_t htons(uint16_t hostshort);? ? //主机字节序转化为网络字节序short类型

????????uint32_t ntohl(uint32_t netlong);? ? ? ? //网络字节序转化为主机字节序 long 类型

????????uint16_t ntohs(uint16_t netshort);? ? ??? //网络字节序转化为主机字节序short类型

2.地址转化函数?

? ? ? ? 一般我们所用的如192.168.10.3这类IP地址是点分式十进制,在网络传输时需要转化为32位无符号整数
点分式10进制转化32位无符号整数函数
?(1)头文件?#include <arpa/inet.h>
?(2)int inet_pton(int af, const char *src, void *dst);
? ? ? 功能:将一个点分式10进制 IP字串转化为一个 32位无符号整数?
? ? ? 参数:?
? ? ? ? ? af ?协议族? ?AF_INET : IPV4? ? ??AF_INET6 :IPV6?...
? ? ? ? ? src:?表示一个不可以修改的字符串 即点分式十进制数串?
? ? ? ? ? dst:? ? 是一个地址 这个地址用于存储32位无符号的整数?
? ? ?返回值:?成功返回 1??失败返回 -1 错误码填充再 errno中?? ? ? ??
? ? ?注意:最后出来的存储 内容并不是小端存储 而是 以网络字节序存储?

32位无符号整数转化点分式10进制函数 ??
? (1)头文件 #include <arpa/inet.h>
??(2)?const char *inet_ntop(int af, const void *src,? char *dst, socklen_t size);
?? ?功能:将一个32位的无符号整数IP地址 转化位 十进制点分式IP地址?
?? ?参数:?
?? ??? ?af 即协议族,同上
?? ??? ?src 存储32位数据的地址?
?? ??? ?dst 即存储点分式字符串的首地址?
?? ??? ?len? ???即缓冲区的长度定义的 因为 IPV4 和 IPV6的协议地址长度是不同?
?? ??? ??? ?定义了两个宏?
?? ??? ??? ??? ?#define INET_ADDRSTRLEN 16? ? ? 缓冲区长度占16个字节?
?? ??? ??? ??? ?#define INET6_ADDRSTRLEN 46?
?? ?返回值:成功返回 存储的首地址 ??失败返回 NULL

3.存储IP地址端口的结构体

? ? ? ? 下面两个结构体可存储绑定socket的IP地址和端口号,一般使用第二个

1.struct sockaddr {
?? ??? ??? ??? ?sa_family_t sa_family; //指的是协议族 即你的地址结构体中需要协议族这个内容?
?? ??? ??? ??? ?char ? ? ? ?sa_data[14]; //存储地址和端口号等信息的?
?? ??? ??? ?}

2.头文件:#include <netinet/in.h >

struct sockaddr_in?{
?? ??? ??? ??? ?sa_family_t sin_family; ? //协议族? ? ? ? AF_INET : IPV4? ? ??AF_INET6 :IPV6?...
?? ??? ??? ??? ?in_port_t sin_port;? ? ? ? ? // 端口号?
?? ??? ??? ??? ?struct in_addr sin_addr;??// IP地址?
?? ??? ??? ?};

struct in_addr{
?? ??? ??? ??? ?u32_i s_addr; //无符号的32位数据 表示 32位的地址?
?? ??? ??? ?}

ps:以上的结构体中存储的数据必须是网络字节序?

4.举例

? ? ? ? 因此,一般绑定socket的地址设定如下

    struct sockaddr_in saddr;
	memset(&saddr,0,sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(88);//88端口号
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //127.0.0.1 IP地址

5.端口号

? ? ? ?端口号说明

6.INADDR_ANY

? ? ? ? 我们有时会遇到addrServer.sin_addr.s_addr = htonl(INADDR_ANY)这种定义,那么INADDR_ANY代表什么意思呢?

?????????INADDR_ANY转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。

比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢?

如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3个ip,也就等于需要管理3个套接字进行数据交换,这样岂不是很繁琐?

所以出现INADDR_ANY,你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,只要是绑定的端口号过来的数据,都可以接收到。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:28:31  更:2021-08-26 12:29:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:24:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码