编写网络应用程序时,经常会用到sockaddr和sockaddr_in这两个结构体,对于新手来说,比较容易搞混它们的区别和使用方法。本文的笔记试图讲清楚它们之间的关系和正确的用法。
1. struct sockaddr_in(针对IPv4使用)
struct sockaddr_in是linux kernel针对IPv4用到的socket address structure(针对IPv6则定义了struct sockaddr_in6来实现类似的结构),写网络应用程序时,我们需要引用其头文件<netinet/in.h>文件。
以sockaddr_in为例,其定义代码如下(严格地说,应该是redhat linux 2.6.9中的定义,vendor或kernel version不同,相关结构的定义形式可能会有差别,但底层的数据表示其实是一致的):
1. struct sockaddr_in(针对IPv4使用)
struct sockaddr_in是linux kernel针对IPv4用到的socket address structure(针对IPv6则定义了struct sockaddr_in6来实现类似的结构),写网络应用程序时,我们需要引用其头文件<netinet/in.h>文件。
以sockaddr_in为例,其定义代码如下(严格地说,应该是redhat linux 2.6.9中的定义,vendor或kernel version不同,相关结构的定义形式可能会有差别,但底层的数据表示其实是一致的):
/* Type to represent a port. */
typedef uint16_t in_port_t;
/* Internet address. */
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr; /* 由于TCP/IP发展的历史原因,这里只有1个字段还用struct包装起来 */
/*《UNIX Network Programming Volume 1》3.1节对此有一段解释,这里不再赘述