Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

netinet/in.h

  • 引用

    #include <netinet/in.h>
    
    
    • 推荐使用<arpa/inet.h>替换,包含了其中所有内容
  • 定义了sockaddr_in结构

    struct sockaddr_in {
        sa_family_t    sin_family
        in_port_t      sin_port
        struct in_addr sin_addr
        unsigned char  sin_zero[8]
    }
    
    • sa_family_t 地址族

      typedef uint16_t sa_family_t
      
      • AF_INET —— IPv4【常用】
      • AF_INET6 —— IPv6
      • AF_LOCAL —— 本地UNIX
    • in_port_t 端口号

      typedef	uint16_t in_port_t;
      
    • in_addr IP地址

      typedef	uint32_t	in_addr_t;
      struct in_addr {
          in_addr_t s_addr;
      };
      
      • 这里要用inet_addr把十进制ip转换为二进制ip,再赋予内部s_addr
    • sin_zero 不使用,但必须填充为0

      • 使用<string.h>提供的memset函数预先置0
        memset(&serv_addr, 0, sizeof(serv_addr))
        
    • 此结构的作用

      • <sys/socket.h>中定义的sockaddr把端口和地址都混杂在sa_data中,难以赋值
      • 这个结构的出现,把端口和地址分开存放,赋值很方便
      • 长度相同,只要进行一次指针转换就行
        (struct sockaddr*) &serv_addr
        
  • #define	INADDR_ANY		(u_int32_t)0x00000000
    #define	INADDR_BROADCAST	(u_int32_t)0xffffffff
    
    • INADDR_ANY 用于自动分配本机的IP地址