【Linux】socket编程1

ops/2024/12/22 18:59:07/

socket编程1

    • 1. 网络字节序
    • 2. ip地址转换函数
    • 3. sockaddr数据结构

1. 网络字节序

多字节数据有大端和小端之分,网络数据流采用大端字节序,如果主机采用的是小端字节序,那么需要转换。

  • 大端:低地址存高字节,高地址存低字节,例如端口号为2048,为0x0800, 则在网络中传输先发08,后发00
  • 小端:低地址存低字节,高地址存高字节
#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
//这里h指host,n指net,l指四个字节数据的转换,s指两个字节的转换
//比如端口转换可以用两个字节的转换,ip可以用四个字节的函数转换

查看本机字节序的方法,可以使用联合体来判断。其中联合体成员设置为short类型和字符数组,然后给short类型赋值,然后查看字符数组的内容,就能知道本机的存储字节序。

#include <stdio.h>union bytelist
{short cont;char chcon[sizeof(short)];
};int main()
{union bytelist byt;byt.cont = 0x0102;printf("byte content is [%d], store 00 is [0x%02d] store 01 is [0x%02d]\n",byt.cont,byt.chcon[0],byt.chcon[1]);//输出  0201,说明低位数据存内存低位地址,高位数据存内存高位地址,小端存储return 0;
}

2. ip地址转换函数

#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);参数:af:只能是这两个 AF_INET or AF_INET6,分别代表ipv4和ipv6src:指源字符串或源ip地址dst:指目的字符串或目的ip地址size:指将ip转成字符串的字符串大小

3. sockaddr数据结构

  以前使用sockaddr这个结构体,但是结构体成员区分不够清晰,所以现在ipv4使用sockaddr_in代替它,这两个内存占用大小是一样的,只有内部成员变量有一点区别。

其中:

  • sockaddr内存占用16个字节,16位地址类型(是ipv4还是ipv6),14字节的地址数据
  • sockaddr_in内存占用16个字节,16位地址类型(是ipv4还是ipv6),16位端口号,32位ip地址,8字节空白填充
//sockaddr 结构体
struct sockaddr {sa_family_t    sa_family; 		/* address family: AF_INET */char 	sa_data[14];			/* 14 bytes of protocol address */
};//sockaddr_in 结构体
struct sockaddr_in {sa_family_t    sin_family; /* address family: AF_INET */in_port_t      sin_port;   /* port in network byte order */struct in_addr sin_addr;   /* internet address */
};/* Internet address. */
struct in_addr {uint32_t       s_addr;     /* address in network byte order */
};

使用的时候转换一下类型:

struct sockaddr_in servaddr;
/* initialize servaddr */
bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));

http://www.ppmy.cn/ops/144097.html

相关文章

Roblox踩坑1——动画无法完整播放

在做一款挂机类游戏的时候&#xff0c;打算给地图怪物做一个被击败动画&#xff0c;我就在击败怪物的回调里面加了一个动画&#xff0c;但是无论如何都没办法正常的播放。 if humanoid then-- 创建一个 Animation 实例并设置动画 IDlocal animation Instance.new("Anima…

simsCheckbox无序列表转换jquery插件

simsCheckbox是一款可以将普通的html无序列表转换为bootstrap样式的checkbox列表的jquery插件。 在线演示 下载 使用方法 在页面中引入bootstrap样式文件&#xff0c;jquery和simsCheckbox.css&#xff0c;以及simsCheckbox.js文件。 <link rel"stylesheet" hre…

【论文阅读】Deep Neural Network Pruning Using Persistent Homology

摘要和介绍 PHPM按照神经元之间的组合效应的大小的升序对DNN进行删减&#xff0c;以防止精度的下降&#xff0c;其中神经元之间的组合效应是利用一维PH计算的。 已经表明PH有利于分析DNN中知识的内部表示[6]&#xff0c;[23]。 [6] C. Corneanu, M. Madadi, S. Escalera, and…

基于SpringBoot的“家具销售电商平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“家具销售电商平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 管理员登录界面 管理员功能界面 家具分类管理…

提示词工程-Prompt Engineering

引 言 prompt&#xff08;提示词&#xff09;是我们和LLM互动最常用的方式&#xff0c;我们提供给LLM的Prompt作为模型的输入&#xff0c;并希望LLM反馈我们期待的结果。 虽然LLM的功能非常强大&#xff0c;但LLM对提示词&#xff08;prompt&#xff09;也非常敏感。这使得提…

算法题(11):R格式

审题&#xff1a; 由于该题的数据值非常大&#xff0c;所以我们需要使用高精度计算法&#xff0c;简单来说就是先把数据通过字符串存储&#xff0c;然后转换到int型数组&#xff0c;对数据每一位分别进行乘法运算&#xff0c;然后循环进位 思路&#xff1a; &#xff08;1&…

Python7-数据结构

记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 python基础7-数据结构的那些事儿 常见的数据结构有哪些&#xff1f;线性数据结构有哪些&#xff1f;非线性数据结构有哪…

进网许可认证、交换路由设备检测项目更新25年1月起

实施时间 2025年1月1日起实施 涉及设备范围 核心路由器、边缘路由器、以太网交换机、三层交换机、宽带网络接入服务器&#xff08;BNAS&#xff09; 新增检测依据 GBT41266-2022网络关键设备安全检测方法交换机设备 GBT41267-2022网络关键设备安全技术要求交换机设备 GB/…