套接字结构体

来源:互联网 发布:阿里云大数据分析 编辑:程序博客网 时间:2024/04/29 05:30

unix网络编程第三章

书中的套接字结构体如下:

IPv4套接字地址结构:

以sockaddr_in命名在<netinet/in.h>头文件中, POSIX定义如下:

struct in_addr {    in_addr_t s_addr; // 32-bit IPv4 address};struct sockaddr_in {    uint8_t        sin_len;     // length of structure (16)    sa_family_t    sin_family;  //AF_INET,8-bit    in_port_t      sin_port;    //16-bit TCP or UDP port number    struct in_addr sin_addr;    //32-bit IPv4 address    char           sin_zero[8]; //unused   };

而ubuntu系统上的IPv4套接字结构和书中的有些不同哦,如下:

/*__SOCKADDR_COMMON 宏定义     bits/sockaddr.h*/#define __SOCKADDR_COMMON(sa_prefix) \  sa_family_t sa_prefix##family#define __SOCKADDR_COMMON_SIZE  (sizeof (unsigned short int))/************************************************************//*           /usr/include/netinet/in.h         */struct in_addr  {    in_addr_t s_addr;  };struct sockaddr_in  {    __SOCKADDR_COMMON (sin_);  /*宏定义*/    in_port_t sin_port;         /* Port number.  */    struct in_addr sin_addr;        /* Internet address.  */    /* Pad to size of `struct sockaddr'.  */    unsigned char sin_zero[sizeof (struct sockaddr) -               __SOCKADDR_COMMON_SIZE -               sizeof (in_port_t) -               sizeof (struct in_addr)];  };

下面这一段为宏定义:

  #define   __SOCKADDR_COMMON(sa_prefix) \  sa_family_t sa_prefix##family

其中,##为连接符,连接前后两个字符串,没有再扩展特性,详见宏定义,即__SOCKADDR_COMMON(sin_);相当于sa_family_t sin_family;
此外,ubuntu系统的套接字结构并没有sin_len成员变量, 为了保持套接字长度一致, sa_family_t 类型变量长度为16位

未完待续

0 0
原创粉丝点击