unix网络编程 套接字
第三章 套接字编程简介
大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。每个协议族都定义了它的套接字地址结构。这些结构的名字均已sockaddr_开头,并以对应的唯一后缀结束。
1.套接字地址结构
IPv4套接字结构
IPv4套接字地址结构通常称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinnet/in.h>头文件中。
以下是网际(IPv4)套接字地址结构:sockaddr_in
长度字段sin_len是为了增加对OSI协议的支持而随4.3BSD-Reno添加到。(因为有了长度字段,才简化了长度可以变套接字地址结构的处理)
POIX规范只需要这个结构中的3个字段:sin_family、sin_add、sin_port。对于符合POIX的实现来说,定义额外的结构字段是可以接收的,这对于网际套接字地址结构来说也是正常的。几乎所有的实现都增加了sin_zero字段,所以所有的套接字地址结构大小都至少是16字节。
数据类型 | 说明 | 头文件 |
int8_t | 带符号的8位整数 | <sys/typcs.h> |
uint8_t | 无符号的8位整数 | <sys/typcs.h> |
int16_t | 带符号的16位整数 | <sys/typcs.h> |
uint16_t | 无符号的16位整数 | <sys/typcs.h> |
int32_t | 带符号的32位整数 | <sys/typcs.h> |
uint32_t | 无符号的32位整数 | <sys/typcs.h> |
sa_family_t | 套接字地址结构的地址族 | <sys/socket.h> |
socklen_t | 套接字地址结构的长度,一般为uint32_t | <sys/socket.h> |
in_addr_t |
IPv4地址,一般为unit32_t |
<netine/in.h> |
in_port_t | TCP或UDP端口,一般为uint16_t | <netine/in.h> |
(扩展)POSIX(Portable Operating System Interface,可移植操作系统接口)
POIX是接口。
POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。
(一些常见的缩写)
addr(address,地址)
info(information,信息)
通用套接字地址结构
通用套接字地址结构:sockaddr
IPv6套接字地址结构
IPv6套接字地址结构在<netinet/in.h>头文件中定义
新的通用套接字地址结构
新的struct sockaddr_storage足以容纳系统所支持的任何套接字地址结构。sockaddr_storage结构在<netinet/in.h>头文件中定义
不同套接字地址结构的比较
2.值-结果参数
传递方式取决于该结构的传递方向:是从进程到内核,还是从内核到进程、
1)从进程到内核传递套接字地址结构的函数有3个:bind,connect和sendto
这些函数的一个参数时指向某个套接字地址结构的指针,另一个参数时该结构的整数大小。
!!套接字地址结构大小的数据类型是socklen_t。(POIX建议将socklen_t定义为uint32_t)
2)从内核到进程传递套接字地址结构的函数有4个:accept,recvfrom,getsocknamo和getpeername。
这4个函数的其中两个参数是指向某个套接字地址结构的指针和指向表示该结构大小的整数变量的指针。
值-结果参数:把套接字地址结构大小这个参数从一个整数改为指向某个整数变量的指针,其原因在于,当函数被调用时,结构大小是一个值,它告诉内核该结构的大小,这样内核在写该结构时不至于越界;
当函数返回时,结构大小又是一个结果,它告诉进程内核在该结构中究竟储存了多少信息。
3.字节排序函数
小端和大端(内存中存储两个字节有两种方法)
小端(little-endian):将低序字节存储在起始地址
大端(big-endian):将高序字节存储在起始地址
主机字节序:某个给定系统所用的字节序
输出字节序的程序:
4.字节操纵函数
bzero:bzero把目标字节串指定数目的字节置为0。我们常用该函数把一个套接字地址结构初始化为0.
bocpy:指定数目的字节从源字节串移动到目标字节串。
bcmp:比较两个任意的字节串,若相同返回值为0,否则返回值为非0.
memset:把目标字节串指定数目的字节置为c。
mencmp:比较两个任意的字符串,若相同为0,否则返回一个非0值,是大于0还是小于0则取决于第一个不等的字节。
5.inet_aton、net_addr和inet_ntoa函数(地址转换函数)
6.inet_pton和inet_ntop函数
函数中的p代表表达(presentation),n代表数值(numeric)
地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构中的二进制。
1)只支持IPv4的inet_pton函数的简单定义
2)只支持IPv4的inet_ntop函数的简化版本
7.sock_ntop和相关函数
作用:它以指向某个套接字地址结构的指针为参数,查看该结构的内部,然后调用适当的函数返回该地址的表达格式。
!!sock是什么?很多时候我们在写代码为了表达清楚这个元素背后的意思,我们都会采用英文单词的缩写。例如这个sock是套接字的英文(socket)的缩写。然后我们可以结合它的意思来理解这些元素的意义,例如sockaddr指的是套接字的套接字的地址,socklen指的是套接字的长度。虽然看到一大串英文字母感到贼烦,但是很多只要理解意思之后就没有那么可怕了。嘻嘻。
原文地址:https://www.cnblogs.com/181118ljh123/p/12002328.html
- 关于梯度下降算法的的一些总结
- Hadoop集群搭建总结及Hadoop2.5集群伪分布、完全分布搭建总结
- 【提高篇】Go语言并发技术详解
- 【提高篇】GO语言标准错误处理机制error用法实例
- 【Golang语言社区】H5游戏开发-从零开始开发一款H5小游戏(四) 撞击吧粒子,炫酷技能的实现
- 机器学习实践:用 Spark 和 DBSCAN 对地理定位数据进行聚类
- 【Golang语言社区】H5游戏开发从零开始开发一款H5小游戏(三) 攻守阵营,赋予粒子新的生命
- 【H5游戏实例】JS+canvas实现人机大战之五子棋
- Go包管理的探索与实践
- 机器学习优化算法之爬山算法小结
- 机器学习之最小二乘法
- Go中的同步与锁
- 机器学习之KNN算法思想及其实现
- 机器学习之决策树熵&信息增量求解算法实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android隐藏标题栏及解决启动闪过标题的实例详解
- Linux使用sed命令替换字符串教程
- Android实现获取短信验证码并自动填写功能
- Android 定时器实现图片的变换
- Android 软键盘状态并隐藏输入法的实例
- Linux磁盘管理之LVM的使用
- Android编程之菜单Menu的创建方法示例
- Ubuntu下Docker CE的安装
- 基于Android自定义控件实现雷达效果
- Android 中 onSaveInstanceState()使用方法详解
- Linux修改主机名的简单方法
- Android RecycleView使用(CheckBox全选、反选、单选)
- Android自定义滑动解锁控件使用详解
- linux nc命令小结
- Android如何自定义EditText光标与下划线颜色详解