unix网络编程学习笔记1

本文详细探讨了在Unix网络编程中,如何处理IPV6的in6addr_any变量赋值问题。通过示例代码和编译错误,解释了C语言中结构体赋值的限制,以及系统如何通过预先分配和初始化解决这一问题。同时,文章还介绍了结构体赋值如何实现数组的真正复制,并提醒读者注意结构体赋值的浅拷贝特性,避免悬挂指针的问题。
摘要由CSDN通过智能技术生成

今天在看UNPV1,4.4节的时候,当看到bind函数在绑定IP地址与端口号时UNP上说:

对于IPV4来说,通配地址由常值INADDR_ANY来指定,其值一般为0;他告知内核去选择IP地址。我们在图1-9中随如下赋值语句看到过它的使用:

structsockaddr_in   servaddr;

servaddr.sin_addr.s_addr= htonl (INADDR_ANY);     /* wildcard */

这对于IPV4而言是可行的,因为其IP地址是一个32位的值,可以用一个简单的数字常数表示,,对于IPV6就不可以这么做了,因为128位的IPV6地址存放在一个结构体中而这个成员又是一个字符数组,我们无法对其直接赋值。

Figure 3.1 The Internet (IPv4)socket address structure: sockaddr_in.

struct in_addr {

  in_addr_t   s_addr;           /* 32-bit IPv4 address */

                                /* network byteordered */

};

 

struct sockaddr_in {

  uint8_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 */

                                /* network byteordered */

  structin_addr  sin_addr;     /* 32-bit IPv4 address */

                                /* network byteordered */

  char            sin_zero[8];  /* unused */

};


Figure 3.4 IPv6 socket addressstructure: sockaddr_in6.

struct in6_addr {

  uint8_t  s6_addr[16];          /* 128-bit IPv6 address */

                                 /* networkbyte ordered */

};

#define SIN6_LEN     /* required for compile-time tests */

struct sockaddr_in6 {

  uint8_t         sin6_len;      /* length of this struct (28) */

  sa_family_t     sin6_family;   /* AF_INET6 */

  in_port_t       sin6_port;     /* transport layer port# */

                                 /* networkbyte ordered */

  uint32_t        sin6_flowinfo; /* flow information,undefined */

  struct in6_addrsin6_addr;     /* IPv6 address */

                                 /* networkbyte ordered */

  uint32_t        sin6_scope_id; /* set of interfaces fora scope */

};

数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值