套接字编程基础

news2024/10/7 6:47:07

文章目录

    • IPV4套接字地址结构
    • IPv6套接字地址结构
    • 字节排序函数
    • 地址转换函数


IPV4套接字地址结构

IPv4套接字定义在<netinet/in.h> 投文件中,定义如下:

struct in_addr {
	in_addr_t s_addr;
}
struct sockaddr_in {
	uint8_t sin_len; // 长度字段
	sa_family_t sin_family; // 通常是一个8位无符号整数,在不支持长度字段实现中,是一个16位无符号整数
	in_port_t sin_port; // 至少16位的无符号整数
	struct in_addr sin_addr; // 32位IPv4地址
	char sin_zero[8]; // 没用
};

可以看出IPv4地址访问方式有两种:一种是serv.sin_addr以结构体的方式使用,另一种及时访问进结构体,使用32位无符号整数。

作为参数传递套接字函数时,套接字地址以引用方式传递,需要强制转换成struct sockaddr*类型,其在<sys/socket.h>中定义为:

struct sockaddr {
	uint8_t sa_len;
	sa_family_t sa_family;
	char sa_data[14]
};

IPv6套接字地址结构

struct in6_addr {
	uint8_t s6_addr[16]; //128bit
};

#define SIN6_LEN
struct sockaddr_in6 {
	uint8_t sin6_len;
	sa_family_t sin6_family;
	in_port_t sin6_port;
	uint32_t sin6_flowinfo; // 
	struct in6_addr sin6_addr;
	uint32_t sin6_scope_id; //表示具有范围的地址的范围
}

字节排序函数

判断系统是大端还是小端格式的方法

#include "stdio.h"

int main()
{
    int a = 0x12345678;
    char *p = (char *)&a;
    printf("*p = %#x\n", *p);
    if(*p == 0x78)
            printf("小端\n");
    else printf("大端\n");
    return 0;
}

网络字节序是大端格式
两种字节序之间的转换可以用下面四个函数

// 将主机字节序转化为网络字节序
uint16_t htons(uint16_t host16bit_value);
uint32_t htonl(uint32_t host32bit_value);

// 将网络字节序,转化为主机字节序
uint16_t ntohs(uint16_t net16bit_value);
uint32_t ntohl(uint32_t net32bit_value);

尝试一下将主机字节序转换成网路字节序
在这里插入图片描述
在这里插入图片描述

地址转换函数

IPv4地址常使用点分十进制表示方法,在编程中要用二进制网络字节序,两者之间转换函数有:
inet_aton, inet_addrinet_ntoa,新的函数inet_ptoninet_ntop对于IPv4和IPv6都适用

#include <arpa/inet.h>
// 将字符串转换成二进制数形式
int inet_aton(const char *strptr, struct in_daar *addrptr)// 返回字符串有效1,无效0
in_addr_t inet_addr(const char *strptr) // 返回32位二进制网络字节序的IPv4地址
// 二进制转换成点分十进制形式
char *inet_ntoa(struct in_addr inaddr) // 返回指向点分十进制字符串的指针

inet_pton和inet_ntop函数

#include <arpa/inet.h>

// 两个函数的family可以是AF_INET, AF_INET6
// strptr所指的字符串转换成addptr所指的二进制数据
int inet_pton(int family, const char *strptr, void *addrptr); 

// 从数值格式转换成点分十进制格式,len指示存放字符串的缓冲区的大小
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);

函数尝试
在这里插入图片描述
输出结果为:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【青训营】性能优化和自动内存管理

本文整理自&#xff1a;第五届字节跳动青年训练营 后端组 什么是性能优化 提高软件系统处理能力&#xff0c;减少不必要消耗&#xff0c;充分利用计算机算力 业务层优化 针对特定场景和具体问题容易获得较大收益 语言运行时优化 面向全公司的优化&#xff0c;非特定场景解决更…

力扣55.跳跃游戏(比较简单)

文章目录力扣55.跳跃游戏&#xff08;比较简单&#xff09;题目描述算法思路代码实现力扣55.跳跃游戏&#xff08;比较简单&#xff09; 题目描述 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度…

Tailscale-搭建异地局域网开源版中文部署指南

目前国家工信部在大力推动三大运营商发展 IPv6&#xff0c;对家用宽带而言&#xff0c;可以使用的 IPv4 公网 IP 会越来越少。有部分地区即使拿到了公网 IPv4 地址&#xff0c;也是个大内网地址&#xff0c;根本不是真正的公网 IP&#xff0c;访问家庭内网的资源将会变得越来越…

SQL注入之联合查询注入与报错注入

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 SQL注入之联合查询 sql注入简单演示 1. 判断sq注入 2. 闭合然后爆列 3. 查看显示列 …

vue中实现后台系统权限管理的功能

一、前言 后台管理系统的权限控制对于前端来说是经常用到的知识点&#xff0c;也比较重要&#xff0c;最近梳理一下写成文章&#xff0c;方便以后查阅。 项目中实现菜单的动态权限控制使用到了两种技术&#xff0c;一种是Vue Router&#xff0c;另一种是vue3官方推荐使用的专属…

蓝桥杯嵌入式第十届学习记录

1&#xff1a;拷贝LCD工程代码作为模板2&#xff1a;注意放置代码得顺序3&#xff1a;注意公共头函数键盘4&#xff1a;串口配置出来方便dubug模式正常接收数据5:记得打定时器中断&#xff08;去历程定时器里面寻找&#xff01;&#xff09;6&#xff1a;细节地方7;LCD每个位置…

[hive]数仓分层|用户纬度拉链表|维度建模

https://www.modb.pro/404?redirect%2Fdb%2F241289一、数仓分层1、ODS层&#xff1a;原始数据层ODS(Ooriginal Ddata Sstore)1)设计要点存储来自多个业务系统、前端埋点、爬虫获取的一系列数据源的数据。我们要做三件事&#xff1a;【1】保持数据原貌不做任何修改&#xff0c;…

一阶高通滤波器学习

导读&#xff1a;本期文章主要介绍一阶高通滤波器。一阶高通滤波器与一阶低通滤波器很相似&#xff0c;都是利用电容阻低频信号通高频信号&#xff0c;电感阻高频信号通低频信号的特点。一、一阶高通滤波器介绍滤波器是作为一种选频装置&#xff0c;是信号处理中的一个重要的概…

Linux(二)进程概念

目录 一、冯诺依曼体系结构 二、操作系统 三、进程概念 1、程序与进程的区别&#xff1a; 2、cpu分时机制 3、pcb——进程控制块 4、进程是什么&#xff1f; 四、进程状态 1、linux状态 2、僵尸态 pid_t fork(void)&#xff1a; fork创建进程之后&#xff0c;父子进…

vector以及list

之前已经学习过了string类&#xff0c;接下来介绍c中的另外两个类—— vector和list&#xff1b; vector 之前介绍的string类是c所特定的字符数组&#xff1b; 而vector可以看做是string类的扩展&#xff0c;因为它是一个模板类&#xff1b; 它可以作为任何类型的数组&#x…

小侃设计模式(廿二)-访问者模式

1.概述 访问者模式&#xff08;Visitor Pattern&#xff09;指的是在类的内部结构不变的情况下&#xff0c;不同的访问者访问这个对象都会呈现出不同的处理方式。它的主要作用时将数据结构与数据操作分离&#xff0c;将不同的算法与其所作用的对象进行分离。本文将详述访问者模…

DW动手学数据分析Task2:数据清洗及特征处理

文章目录一 数据清洗1 缺失值观察与处理1.1 缺失值观察1.2 缺失值处理2 重复值观察与处理二 特征处理1 分箱&#xff08;离散化&#xff09;处理2 对文本变量进行转换3 从纯文本Name特征里提取出Titles的特征3 参考文章一 数据清洗 数据清洗&#xff1a;我们拿到的数据通常是不…

树的知识概括锦囊(一)

作者&#xff1a;爱塔居 专栏&#xff1a;数据结构 作者简介&#xff1a;大三学生&#xff0c;希望跟大家一起进步&#xff01; 文章目录 目录 文章目录 一、树形结构 二、树的基础知识 三、二叉树 3.1 概念 3.2 特殊的二叉树 ​编辑 3.3 二叉树的性质 四、习题挑战 一、树形结…

手把手教你学51单片机-如何学习单片机

大多数大学生之所以最后变的平庸,不是因为脑子多么笨,也不是全怪自己贪玩不上进,只是没有一个好的领路人,许多学校可能挂着导师的名头,但是多数是挂羊头卖狗肉或者是干脆不管。最后等大学生毕业之后,那些所谓的老师就会说学生很差或者学习很差,反正就是跟自己没啥关系。…

OSPF综合实验(华为)

题目&#xff1a; 思路&#xff1a; 首先配置每个区域的路由和环回地址&#xff0c;其次&#xff0c;根据题目要求打通每个网络的连接&#xff0c;区域0用MGRE打通网络&#xff0c;区域4需要重发布&#xff0c;其次再考虑优化的问题。ip地址的规划是为了更好的路由汇总&#x…

《 Unity Shader 入门精要》第5章 开始 Unity Shader 学习之旅

第5章 开始 Unity Shader 学习之旅 5.2 一个最简单的顶点/片元着色器 顶点/片元着色器的基本结构 // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)// 定义 shader 的名字 Shader "Chapter 5/Simple Shader" {SubShader{Pass {//…

自动驾驶控制算法之车辆横向控制(project)

本文为深蓝学院-自动驾驶控制与规划-第三章作业 目录 1 projection introduction 2 思路提示 2.1 ComputeControlCmd 2.2 ComputeLateralErrors 3 Corer Case 3.1 Low speed operation 3.2 Extra damping on heading 3.3 Steer into constant radius curve 4 ROSLGSV…

FFmpeg-4.2.4的filter: drawbox源码分析

1. vf_drawbox.c功能 有两个功能 ,添加方框,和添加网格; 1.1 添加方框效果 1.2 添加网格效果

c++数据结构-树(详细总结附代码,一看就懂)

树的定义一棵树是由n&#xff08;n>0&#xff09;个元素组成的有限集合&#xff0c;其中&#xff1a;&#xff08;1&#xff09;每个元素称为结点&#xff08;node&#xff09;&#xff08;2&#xff09;有一个特定的结点&#xff0c;称为根结点或树根&#xff08;root&…

上海亚商投顾:双创指数低开高走,数字经济继续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日低开高走&#xff0c;创业板指午后涨超1%&#xff0c;科创50指数涨超1.6%。数字经济概念继续爆发&#…