套接字编程基础

news/2023/6/8 0:05:57

文章目录

    • 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.exyb.cn/news/show-4578236.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

Windows注册表及常见子项

Windows注册表五大根键以及常用注册表项 注册表概述&#xff1a;注册表是Windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”&#xff0c;也可以说是一个非常巨大的树状分层结构的数据库系统。注册表记录了用户安装在计算机上的软件和每个程序…

Windows Server 2008 技术概述

简介 概述Microsoft Windows Server 2008 用于在虚拟化工作负载、支持应用程序和保护网络方面向组织提供最高效的平台。它为开发和可靠地承载 Web 应用程序和服务提供了一个安全、易于管理的平台。从工作组到数据中心&#xff0c;Windows Server 2008 都提供了令人兴奋且很有价…

朗国科技助力OpenHarmony生态繁荣

随着 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;的布局开展&#xff0c;“万物互联”已逐步自证其并非纸上谈兵的概念词&#xff0c;而是众多科技组织及个人的技术新机遇。乘着这一新信息技术演进的东风&#xff0c;广州朗国电子科技股份有限公司&a…

朗新科技林海潮:企业应用的云上架构演变

2016云栖大会上海峰会于2016.1.20日在上海科技馆顺利举办。本文是根据朗新科技首席架构师林海潮在2016云栖大会上海峰会《互联网架构及实践专场》的演讲中分享内容整理而成&#xff0c;林海潮分享了传统行业在使用云架构时采用的技术和一些心得收获。 下面是演讲内容整理。 业务…

云场景实践研究第5期:朗新科技

2019独角兽企业重金招聘Python工程师标准>>> 从13年的费控到双向电表&#xff0c;传统的电力行业正向互联网转型&#xff0c;目前采用的方式是以小时为基准&#xff0c;对整体数据处理。面对千万级别数据量和数以百万计的高并发实时查询以及异构平台的接入&#xff…

Oracle强制加了hint实效三种连接方式使用场合判断

开发写了一个语句使用了connect by level函数 SELECT DISTINCT CTMID FROM ( SELECT CTMID, REGEXP_SUBSTR(FLTUSERIDSTR, ‘[^;]’, 1, l) AS userid FROM s_userinfo,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<300) b WHERE l < LENGTH(FLTUSERIDSTR) - LENGTH(rege…

Vue子组件使用$emit接收从父组件的返回值

1.父组件 <template><div><div style"font-weight:bold">{{ fatherText }}&#xff1a;{{ toChild }}</div><br /><child-datashowFatherData"updateFatherData"getFromChild"getFromChild":toChildData"…

vue 父组件调用子组件中的方法 解决刷新后子组件通过props从父组件接受的数据丢失问题

父组件调用子组件中的方法 解决刷新后子组件通过props从父组件接受的数据丢失问题 问题描述:如图:刚开往网页的时候,子组件中的查询条件的下拉框的数据是有的,但是一旦点击浏览器的刷新后,数据就丢失了. 说明:子组件通过props从父组件接受的数据 解决方法,在父组件的请求数据…