当前位置: 首页 > article >正文

【Linux】socket编程1

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和ipv6
    src:指源字符串或源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.kler.cn/a/441418.html

相关文章:

  • MySQL命令及用法(精华版)
  • 算法基础 -- 快速幂算法详解
  • 【C++】详细讲解继承(下)
  • 【Redis】事务
  • LINUX下设置分离状态(Detached State)和未设置分离状态的主要区别在于线程资源的管理方式和线程的生命周期。以下是两种状态的对比:
  • 数据结构测试题2
  • jmeter后端监视器
  • selenium 在已打开浏览器上继续调试
  • C/S软件授权注册系统-轻量级WebApi服务器介绍
  • 【Python爬虫系列】_034.抓包工具_Charles
  • AI大模型学习笔记|多目标算法梳理、举例
  • 【Excel】单元格分列
  • webSokect安卓和web适配的Bug 适用实时语音场景
  • 优化算法更新 | 基于WOA-CNN-BiLSTM的多步预测模型
  • C#/Winfrom -文件操作
  • Unity中展示当前时间
  • 使用 rvest 包快速抓取网页数据:从入门到精通
  • .NET6 WebAPI从基础到进阶--朝夕教育
  • Kubernetes Service 详解:如何轻松管理集群中的服务
  • 什么是MyBatis?
  • 【java-数据结构篇】揭秘 Java LinkedList:链表数据结构的 Java 实现原理与核心概念
  • [数据结构]无向图的深度优先非递归遍历
  • Python中cv2 (OpenCV, opencv-python)库的安装、使用方法demo最新详细教程
  • TGA历年最佳年度游戏
  • 靜態IP與DHCP的區別和用法
  • 基于springboot+vue实现的北部湾地区助农平台 (源码+L文+ppt)4-119