最近在模拟测试IPv6客户端连接服务器,但是总会报参数不正确,后来我使用strace追踪java-SocketTest(ipv6测试工具)的连接发现IPv6 Connect需要初始化sin6_scope_id字段,才可以Connect successserver_addr.sin6_scope_id = if_nametoindex("eth0");
if_nametoindex函数定义:#include unsigned if_nametoindex(const char *ifname); char *if_indextoname(unsigned ifindex, char *ifname); struct if_nameindex *if_nameindex(void); void if_freenameindex(struct if_nameindex *ptr);
if_nametoindex():指定网络接口名称字符串作为参数;若该接口存在,则返回相应的索引,否则返回0
if_indextoname():指定网络接口索引以及一块长度至少为IF_NAMESIZE(16)字节的内存区域作为参数;若索引对应的网络接口存在,则在内存区域中返回该接口的名称字符串,否则返回NULL,并将errno设置为相应的值
if_nameindex():返回动态分配的struct if_nameindex结构数组,数组中的每一个元素分别对应一个本地网络接口;struct if_nameindex结构的if_index字段为接口索引,if_name字段为接口名称字符串;索引为0且名称字符串为NULL表示结构数组的末尾;调用出错时,返回NULL,并将errno设置为相应的值
if_freenameindex():通过if_nameindex()获取完毕接口名称与索引后,调用该函数以释放动态分配的内存区域。