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

Linux网络: socket初识

一些概念

简单了解一下TCP,UDP这两个协议,和一些概念

TCP与UDP

学校教过TCP是

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流


而UDP是

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

当时完全不知道这些什么意思

网络字节序

网络通信,要接收和发送数据。我们知道机器分为大端和小端存储,那传输数据的时候就需要一个固定的标准,防止出错。
于是有了:TCP/IP规定的网络字节序,低地址高字节

1.发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
2.因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节. 不管这台主机是大端机还是小端机,
都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
3.如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

在这里插入图片描述

主机序列与网络序列的相互转换

在头文件<arpa/inet.h> 给了4个接口

函数含义作用
htonshost to network short本地主机的 16 位整数转为网络序
htonlhost to network long本地主机的 32 位整数转为网络序
ntohsnetwork to host short网络序的 16 位整数转为主机序
ntohlnetwork to host long网络序的 32 位整数转为主机序

Socket编程

sockaddr

sockaddr是网络通信的通用结构体

struct sockaddr {sa_family_t sa_family; // 地址族(协议族),如 AF_INETchar sa_data[14];      // 协议地址(具体内容依赖于地址族)
};

还有另外两个结构体:

  1. sockaddr_in
struct sockaddr_in {sa_family_t sin_family;   // 地址族,必须是 AF_INETuint16_t sin_port;        // 端口号(网络字节序)struct in_addr sin_addr;  // IP 地址char sin_zero[8];         // 填充字节,保持与 sockaddr 一致
};

特别提示: sin_addr
结构体in_addr封装如下

struct in_addr {in_addr_t s_addr; // IPv4 地址,32 位,网络字节序
};

所以赋值的时候:要对s_addr进行操作

addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 点分十进制转网络字节序

地址类型给AF_INET,表示网络通信
2. sockadd_un

struct sockaddr_un {sa_family_t sun_family;     // 地址族,必须是 AF_UNIXchar sun_path[108];         // 本地文件路径,作为套接字标识
};

地址类型给AF_UNIX,表示本地通信
在这里插入图片描述

IP地址格式

IP地址有点分十进制(“127.0.0.1”)和十六进制4字节序列(0xC0A80101)

点分十进制是为了方便阅读,但是,s_addr是4字节序列的格式,像下面这样

addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 点分十进制转网络字节序

就需要调用函数来进行转换

函数作用
inet_aton点分十进制 → 4 字节网络序
inet_ntop4 字节网络序 → 点分十进制
in_addr_t inet_addr(const char *cp);

网络字节序再转换一次?

转换为4字节序列后,需要转换成网络字节序再存入sockaddr_in

好消息,好消息!
inet_addr先完成转换到4字节序列,再转换为网络字节序

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);

补充:内存置0另一种方法(bzero与memset)

memset很常用,这里补充一个新的接口

void bzero(void *s, size_t n);
//s:指向要清零的内存块的起始地址。
//n:要清零的字节数。

举个例子

struct sockaddr_in addr;
bzero(&addr, sizeof(addr));

他等价于

memset(&addr, 0, sizeof(addr));

当然:依然推荐用memset
因为bzero 在 POSIX 标准中已废弃

小结

介绍了socket基本概念和socket初始化的操作

http://www.dtcms.com/a/269279.html

相关文章:

  • C++--map和set的使用
  • 网安系列【11】之目录穿越与文件包含漏洞详解
  • ULVAC爱发科RFS03D RF POWER SUPPLY INSTRUCTION MANUAL RF射频电源
  • Kotlin数值计算Long型乘Float浮点型
  • 安卓10.0系统修改定制化____recovery-from-boot.p文件的具体作用 在定制项目中的关联
  • LLVM,polly,最新测试
  • 【郑大二年级信安小学期】Day6:CTF密码学杂项工具包
  • Multi-Agent 多智能体架构解析--DeerFlow
  • 【DPDK应用篇】事件驱动架构:eventdev异步处理模型的设计与实现
  • 大数据Spark(六十二):Spark基于Yarn提交任务流程
  • C++内存泄漏排查
  • 施密特触发器Multisim电路仿真——硬件工程师笔记
  • 暑假读书笔记第三天
  • Linux信号处理全解析
  • Qt中的QProcess类
  • 【学习笔记】大数定理,频率与概率,均值与期望的区别
  • MySQL数据表设计 系统的营销功能 优惠券、客户使用优惠券的设计
  • 2025Q2大模型更新汇总(大语言模型篇)
  • Web后端开发-分层解耦
  • 【Java面试】如何保证接口的幂等性?
  • Day06_刷题niuke20250707
  • pythone相关内容一
  • Spring 如何干预 Bean 的生命周期?
  • 洛谷 P5788 【模板】单调栈
  • 龙旗科技社招校招入职测评25年北森笔试测评题库答题攻略
  • 人工智能-基础篇-22-什么是智能体Agent?(具备主动执行和调优的人工智能产物)
  • elementUI vue2 前端表格table数据导出(二)
  • 超光谱相机的原理和应用场景
  • Java后端技术博客汇总文档
  • C语言——编译与链接