| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 网络编程用到的函数 -> 正文阅读 |
|
[系统运维]网络编程用到的函数 |
记录一些《Linux高性能服务器》中用到的函数。 先说说什么是API。操作系统是软硬件的交界面,百度百科说:
所以下面介绍的这些函数,其实都是操作系统提供给程序员的程序接口,就是一组系统调用(例如socket,listen,accept这些函数),利用这些函数可以让操作系统帮助我们做事。操作系统内核不能让我们随意操作,所以必须由操作系统来控制资源的使用。 第5章 Linux网络编程基础APIsocket地址API??一个IP地址和一个端口号组成的 (ip, port) 唯一表示了使用TCP通信的一端,称作socket地址。 1.主机字节序和网络字节序小端字节序也叫主机字节序,PC多用这个。是指整数的高位字节存储在内存高地址处,而低位字节则存储在内存的低地址处。 大端字节序也叫网络字节序,网络传输都用这个。是指将整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。32位机的CPU的累加器一次能装载至少4字节——32bit,表示一个整数,则高位字节23~31bit存储在低地址处,而低位字节0~7bit存储在高地址处。 为了收发双方使用的字节序避免不一致导致解释错误,发送端总是把要发的数据转为大端字节序再发送,而接收端知道对方传来的数据是大端字节序,所以根据自身采用的字节序觉得是否转换。大端字节序为所有接收数据的主机提供了一个正确解释收到的格式化数据的保证。 可以用代码检查机器大小端。两种字节序之间可转换:
这里的l代表long 长整型,s代表short 短整型。 2.通用socket地址——sockaddr?sa_family成员是地址族类型(sa_family_t)的变量,地址族类型通常和协议族类型对应。 协议族protocal,也叫domain。 ?表格里这些PF_*和AF_*是宏,二者有完全相同的值,它们定义在<bits/socket.h>。 ?sa_data成员存放socket地址值,但是不同协议族的地址值具有不同的含义和长度。但data只有14字节(Byte)可能放不下下面这些协议所需要的108B、26B等等。 ?所以又来一个通用socket地址结构体,提供了足够的空间,且是内存对齐的: ? ?3.专用socket地址——sockaddr_**上面两个通用socket地址结构体不太好用,比如设置和获取IP地址和端口号就需执行繁琐的位操作。所以Linux为各个协议族提供了专门的socket地址结构体,前面说过有3个协议族。
? ?所有专用socket地址以及sockaddr_storage类型的变量实际使用时都需要转化为通用socket地址类型sockaddr(强制转换即可),因为所有socket编程接口使用的地址参数的类型都是sockaddr。 ?4.IP地址转换函数 人习惯用可读性好的点分十进制字符串来表示IP地址,用十六进制字符串表示IPv6地址,但编程需要转为整数(二进制数)。 ?不可重入是指静态变量上次存储的内容,再次调用inet_ntoa函数后被覆盖了。 ?还有3个函数也和inet_addr、inet_aton、inet_ntoa有同样功能,同时可用于IPv4和IPv6地址: socket基础API? ?<sys/socket.h>创建socket(socket),命名socket(bind),监听socket(listen),接受连接(accept),发起连接(connect),读取数据,获取地址信息,检测带外标记,以及读取和设置socket选项。 1.创建socket——socket
?2.命名socket——bind创建socket时只给它指定了地址族,但没指定使用该地址族中哪个具体socket地址。将一个socket与socket地址绑定称为给socket命名,其实就是绑定bind。 在服务器程序中,通常要命名socket,因为只有命名后客户端才能直到该如何连接它。 客户端通常不需要命名socket,而是采用匿名方式,即使用操作系统自动分配的socket地址。 ?3.监听socket——listensocket被命名后还不能马上接受客户连接,还需创建一个监听队列以存放待处理的客户连接。 ?4.接受连接——accept服务器通过读写这个返回的新socket来和被连接的客户端通信,而负责监听的那个socket会继续监听新的连接请求。当监听队列里处于ESTABLISHED状态的连接对应的客户端出现网络异常或者提取退出,服务器对这样一个连接执行accept调用会怎样?会正常返回。 5. 发起连接——connect服务器通过listen调用来被动接受连接,那么客户端需通过accept系统调用来请求与服务器建立连接。 ?注意,客户端在请求连接connect之前,也需要先调用socket函数创建socket,但不需要bind。因为客户端通常不需要命名socket,而是采用匿名方式,即使用操作系统自动分配的socket地址。 ?6.关闭连接——close,shutdown关闭连接实际上就是关闭该连接对应的socket,可以用关闭普通文件描述符的系统调用来完成。 ?注意:父进程和子进程都需要关闭一次这个socket才行! 如果想立即终止连接而不是将socket的引用计数减1,可以用shutdown系统调用,它是专门为网络编程设计的。 ?7.数据读写(1)TCP数据读写——recv,send flags是一些额外控制,例如是否阻塞、是否紧急。 ?MSG_OOB表示发送和接收带外数据。 (2) UDP数据读写——recvform,sendto ?(3)通用数据读写函数——recvmsg,sendmsg ?(4)带外标记——sockatmark socket网络信息API? ?<netdb.h>实现主机名和IP地址之间的转换,以及服务器名称和端口号之间的转换。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 10:56:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |