ipv6 的socket编程

sandy_shell 2016-06-15 10:54:04
苹果于6.1要求上架appStore的应用全都需要支持ipv6 only。
而我的应用主要是基于UDP和TCP通信的。所以大量使用了底层。
现在按照苹果设置ipv6环境的步骤,使我的手机设置成了ipv6环境,其它网络没变。
如果什么都不改,肯定通信失败。
然后我就初始化了一个ipv6的socket

m_udpSocket = socket(AF_INET6, SOCK_DGRAM,IPPROTO_UDP);
然后调用以下发送代码:
struct addrinfo address, *res;
const char* ipAddress = pkt->destIp;
if(NULL == ipAddress){
LOGE(TAG," dest ip is NULL..");
return;
}
LOGI(TAG, "target ip:%s,port:%d",ipAddress,pkt->destPort);
memset(&address, 0, sizeof(address));
address.ai_family = AF_UNSPEC;
address.ai_socktype = SOCK_DGRAM;
address.ai_flags = AI_DEFAULT;
address.ai_protocol = IPPROTO_UDP;
char ip[20];
if (strcmp(ipAddress, "255.255.255.255") == 0) {
ipAddress = "FF02::1"; //组播地址
}

char portStr[5];
sprintf(portStr, "%d",pkt->destPort);


int result = getaddrinfo(ipAddress, portStr, &address, &res);
//如果转换失败
if( 0 != result){
LOGE(TAG,"convert ip address failed..");
return;
}
int headLen = m_headLen;
if(pkt->isRemote)
headLen = m_remoteLen;
int len = headLen + pkt->dataLen;
uint8 buff[len+1];
buildFrame(pkt, buff);
printHexString(buff, len);

ssize_t sendSize = sendto(m_udpSocket, buff, (size_t)len, 0,res->ai_addr, res->ai_addrlen);
if( -1 == sendSize){

LOGE(TAG,"send data failed!!!..");
}


但如果ipAddress为ipv4的ip地址时,则sendto将会发送失败。如果是ipv6的地址的话,则能够发送成功。(暂不讨论它发到了哪里,有没有响应)。
但是我这只能得到一个ipv4的地址。这种情况下,我能够正常通信么?socket要怎么改呢?
...全文
238 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandy_shell 2016-06-17
  • 打赏
  • 举报
回复
引用 2 楼 diyal 的回复:
http://blog.csdn.net/diyal/article/details/51645207
谢啦!也就是我得先把ip地址改为域名,然后在根据域名去解析是ipv6还是ipv4.再去创建相应的socket,连接发送。 可是我们这个系统好像有点复杂哎,那个ip有可能是服务器返回的,那个还可以改为域名。可另外还有一个是通过发送广播包获取的ip。而且还是必须先通过广播才能获取ip。
Diyal 2016-06-16
  • 打赏
  • 举报
回复
http://blog.csdn.net/diyal/article/details/51645207
网易云捕 2016-06-15
  • 打赏
  • 举报
回复
看下google的这个库吧:CocoaAsyncSocket:https://github.com/robbiehanson/CocoaAsyncSocket 里面有代码展示:Socket如何同时支持IPV4和IPV6。比如: ... if(address4) *address4 = [NSData dataWithBytes:&nativeAddr length:sizeof(nativeAddr)]; if(address6) *address6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; ...

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧