ipv6

 都是嚷嚷要准备IPV6了,那就准备在FtpAnywhere中整合IPV6支持,以前只是在TCP/IP协议卷中,在LINUX中接触到了IPV6,可是换到WINSOCK环境,我 太阳 MAKEDOLLAR的主宗,竟然和LINUX写的方法不一样,没办法,只有看SDK重新来,其实有了TCP IP协议卷的基础,看WINDOWS下的SDK,还是比较轻松的,一个函数,getaddrinfo,这个函数被MS用烂了,不管什么情况,都是枚举本地协议,然后绑定,其实根本不需要这么复杂的,
不就是分别创建两个SOCKET吗,一个IPV4,一个IPV6,
那IPV4根据以往的方法创建就是,而IPV6,只需要将协议族改成AF INET6就可以了,需要关注的是BIND绑定部分,一般是采用SOCKADDR_STORAGE来代替传统的sockaddr_in,这上面有个转换的问题,用在IPV4的时候,用 sockaddr_in *强制转换,而用在IPV6的时候,请注意,要使用sockaddr_in6进行转换,其实你直接用 char mstorage[256],也可以,因为WINSOCK函数是根据第一个unsigned short值来确定结构的,使用前用指针强制转换一下就可以了
一个很用的函数是WsaStringToNum函数,可以把IPV6格式的字符串转换为sockaddr_in6中的地址值,如果你要混杂监听怎么办?
很简单,直接将地址清零就可以了,你可以直接调用IN6_SET系列函数,不过你在IDE开发环境下是不会出现的,需要直接到wstcpip.h文件中去拷贝,wstcpip.h是个好东西,你自己看里面的函数,可以看到很多没有公开的INLINE函数,处理IPV6地址协议是非常方便的

一句话,MS VS 2005 SDK/HELP中提供的IPV4/V6双协议解决代码,用在正式开发中是不合适的,MS是推荐使用getaddrinfo函数加HINT指针循环来处理,我个人强烈反对这么做,要支持IPV4/V6监听,我建议你直接使用AF INET/6来分别创建和捆绑,比getaddrinfo的效率要高很多,而且可以避免从IPV4到IPV6过渡时变更太激烈,你可以检索下网络上如何编写IPV6的SOCKET代码,几乎全部是以MS那个SDK为基础修改来的,而这里,我想补充的是,那个SDK可能根本就是在误导IPV6的初学者。

那什么时候使用getaddrinfo呢?我个人认为,当且仅当你需要对一个站点进行 IPV4+IPV6的DNS的时候,才需要使用这个函数,如果你的代码只支持IPV4,那么完全没必要使用getaddrinfo,因为这个函数的不合理指定会加重网络上DNS服务器的负担,调用者[例如MS SDK中的代码]常常不指定协议族,结果,就出现了众所周知的DNS负担问题了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值