写在开头:
在第二篇博文中我们学习了套接字编程所需要的关于传输层协议的一些理论知识,从而对像“TCP建立连接的三次握手”等知识有了了解。在掌握了这些知识之后,我们开始学习套接字编程的API。因为API太多而且使用不同传输协议的套接字有些API不同,所以给我们的学习带来了很大的困难。为了系统的有层次的学习这些API,我们将遵循《Unix网络编程套接字联网API》这本书中的顺序来学习。所以我们首先需要学习的是所有套接字都会用的一些辅助的基础的API,包括:“套接字地址结构”,“字节排序函数”,“字节操作函数”,“地址转换函数”等。下面我们依次来学习这些API。
总结一些知识是快乐的也是痛苦的。
------------------------------------------------------------------------------------------------------------------------
套接字地址结构:
在最开始的第一篇博文的daytimetcpcli.c的line 8中有过这么一个结构体的定义:
struct sockaddr_in servaddr;
当时候的解释是这样的:“line8 定义了一个sockaddr_in类型的结构体 servaddr用来标识将要访问的服务器的ip地址以及端口号等,sockaddr_in是ipv4的结构体类型”。在daytiemimetcpsrv.c中也有同样的一个地址结构的定义。在这一部分,我们就开始讲解sockaddr_in等这一类套接字地址结构。
学习套接字地址结构的意义在于好多的套接字函数都需要一个指向这个套接字地址结构的指针作为参数,而且有些时候需要对这个地址结构的一些成员进行赋值操作,所以我们应该熟知这些地址结构的内容。主要有如下几类套接字地址结构:
IPv4套接字地址结构
IPV4套接字地址结构也称为“网际套接字地址结构”,以sockaddr_in来命名,可以查看你机器的或者是linux源码中的<netinet/in.h>中的内容。因为Unix毕竟和linux有些不同,而且不同发行版本之间也有不同,所以这个结构体中的有些成员函数的定义有少许差别,但是总体上没有太大差别,这里列出书上给的定义:
struct in_addr {
in_addr_t s_addr; /*32位的网络字节流ip地址 */
}
struct sockaddr_in {
unit8_t sin_len; /* length of structure (16) */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16-bit TCP or UDP port number in network byte ordered*/
struct in_addr sin_addr; /* 32-bit IPv4 adddress in network byte ordered*/
char size_zero[8]