IPv6网络编程注意[from IPv4]随笔

C语言IPv6网络编程注意[from IPv4]随笔

在选择address_family时(如socket()、inet_ntop()第一个参数,sockaddr_in6.sin6_family)使用AF_INET6即可,以及操作级别(如setsockopt的形参level)和操作选项时采用对应的IPPROTO_IPV6级别(而非IPPROTO_IP) / IPV6_** 操作名(而非IP_**)

IPv4仅32位用int即可表示,IPv6的地址长达128位,只能用IN6_ADDR结构体或者字符串表示,只能通过inet_ntop、inet_pton函数转换,无法直接赋值

原始套接字raw socket自定义报文首部(IPV6_HDRINCL)仅在WINDOWS下(或高版本linux内核下?)可用,但WINDOWS下无法通过setsockopt来设置如IPV6_TCLASS、IPV6_RTHDR此类选项(WINDOWS下注意使用WSAStartup、WSACleanup等)(对于IPV6_RTHDR等IPv6扩展报头在windows下同样无法通过sendmsg的辅助数据来发送,linux等其余系统可以)

对于IPv4和IPv6通用对套接字/文件描述符的控制方法如select;WINDOWS使用closesocket关闭套接字,其他系统需要注意shutdown()和close()的区别;WINDOWS使用ioctlsocket和SetHandleInformation等,其余系统采用ioctl/fcntl

sockaddr和sockaddr_in结构体占用空间大小相同,但sockaddr_in6结构体更大,在调用一些函数时需注意对象本体的生存期,且其成员sin6_flowinfo和sin6_scope_id基本被遗弃了不使用

vxworks系统采用connectWithTimeout和控制路由的ipRouteCreate;linux系统可对in6_rtmsg结构体(IPv4为rtentry)采用ioctl的SIOCADDRT、SIOCDELRT选项进行操作,以及sendmsg自带的inet6_rth_init()、recvmsg自带的inet6_rth_reverse()等接口

可以通过getaddrinfo获取字符串(主机名)的IP信息,getsockname获取已经绑定套接字的IP信息


随便瞎写的,有些乱,错失请指正

参考文章:
IPv6 基本原理详解介绍
sockopt套接字选项操作
Linux C/C++下IPv6 socket详解
《UNIX网络编程卷1_套接字联网API(第3版)》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值