升级支持ipv4/ipv6后的Socket处理(cocos2dx项目苹果审核支持ipv6处理二)
2016-10-19 16:12
796 查看
升级支持ipv4/ipv6后的Socket处理
前提条件是socket已经支持ipv4处理,需修改以下两处:
1.创建socket时
//解析是ipv4地址还是ipv6地址
struct
addrinfo addrin;
struct
addrinfo* pAddr = &addrin;
int nRet =
getaddrinfo(m_sAddress.c_str(),
nullptr, nullptr, &pAddr);
int _ai_family;
if(nRet != 0)
{
freeaddrinfo(pAddr);
_ai_family = AF_UNSPEC;
return
false;
}
_ai_family = pAddr->ai_family;
// 创建主套接字
m_sockClient =
socket(_ai_family,
SOCK_STREAM, IPPROTO_TCP);
if(m_sockClient ==
INVALID_SOCKET)
{
freeaddrinfo(pAddr);
closeSocket();
CCLOG("CGameSocket:初始化失败");
return
false;
}
freeaddrinfo(padder);
2.connect的时候
std::vector<std::string> ips;
struct
addrinfo hints, *pAddr;
memset(&hints, 0,
sizeof(hints));
hints.ai_family =
PF_UNSPEC;
hints.ai_socktype =
SOCK_STREAM;
hints.ai_flags =
AI_PASSIVE;
hints.ai_protocol =
IPPROTO_IP;
int error =
getaddrinfo(m_sAddress.c_str(),
nullptr, &hints, &pAddr);
if (error != 0 )
{
printf("getaddrinfo: %s\n",
gai_strerror(error));
return;
}
if (pAddr->ai_family ==
AF_INET)
{
struct
sockaddr_in* ipv4 =
nullptr;
char str[32] = {0};
for (auto iter = pAddr; iter !=
nullptr; iter = iter->ai_next)
{
ipv4 = (struct
sockaddr_in*)iter->ai_addr;
inet_ntop(AF_INET, &ipv4->sin_addr, str, 32);
ips.push_back(str);
}
}
else
if(pAddr->ai_family ==
AF_INET6)
{
struct
sockaddr_in6* ipv6 =
nullptr;
char str[40] = {0};
for (auto iter = pAddr; iter !=
nullptr; iter = iter->ai_next)
{
ipv6 = (struct
sockaddr_in6*)iter->ai_addr;
inet_ntop(AF_INET6, &ipv6->sin6_addr, str, 40);
ips.push_back(str);
}
}
int nReady;
std::vector<std::string>
ipVector = ips;
if (pAddr->ai_family ==
AF_INET6)
{
for (auto iter = ipVector.begin(); iter!= ipVector.end();
iter++)
{
std::string ip = iter->c_str();
sockaddr_in6 sa = {0};
struct
in6_addr addr = {0};
inet_pton(pAddr->ai_family, ip.c_str(), &addr);
sa.sin6_family = pAddr->ai_family;
sa.sin6_port =
htons(m_wPort);
sa.sin6_addr = addr;
nReady = ::connect(m_sockClient, (sockaddr*)&sa,
sizeof(sa));
if (nReady == 0)
break;
}
}
else
{
std::string ip = ipVector.at(0);
sockaddr_in sa = {0};
struct
in_addr addr = {0};
inet_pton(pAddr->ai_family, ip.c_str(), &addr);
sa.sin_family = pAddr->ai_family;
sa.sin_port =
htons(m_wPort);
sa.sin_addr = addr;
nReady = ::connect(m_sockClient, (sockaddr*)&sa,
sizeof(sa));
}
freeaddrinfo(pAddr);
if( nReady !=
SOCKET_ERROR )
{
//接收线程
std::thread pSocketRecv(&CGameSocket::onThreadRecv,
this);
pSocketRecv.detach();
CCLOG("CTCPSocket: Connect Succeed");
}
前提条件是socket已经支持ipv4处理,需修改以下两处:
1.创建socket时
//解析是ipv4地址还是ipv6地址
struct
addrinfo addrin;
struct
addrinfo* pAddr = &addrin;
int nRet =
getaddrinfo(m_sAddress.c_str(),
nullptr, nullptr, &pAddr);
int _ai_family;
if(nRet != 0)
{
freeaddrinfo(pAddr);
_ai_family = AF_UNSPEC;
return
false;
}
_ai_family = pAddr->ai_family;
// 创建主套接字
m_sockClient =
socket(_ai_family,
SOCK_STREAM, IPPROTO_TCP);
if(m_sockClient ==
INVALID_SOCKET)
{
freeaddrinfo(pAddr);
closeSocket();
CCLOG("CGameSocket:初始化失败");
return
false;
}
freeaddrinfo(padder);
2.connect的时候
std::vector<std::string> ips;
struct
addrinfo hints, *pAddr;
memset(&hints, 0,
sizeof(hints));
hints.ai_family =
PF_UNSPEC;
hints.ai_socktype =
SOCK_STREAM;
hints.ai_flags =
AI_PASSIVE;
hints.ai_protocol =
IPPROTO_IP;
int error =
getaddrinfo(m_sAddress.c_str(),
nullptr, &hints, &pAddr);
if (error != 0 )
{
printf("getaddrinfo: %s\n",
gai_strerror(error));
return;
}
if (pAddr->ai_family ==
AF_INET)
{
struct
sockaddr_in* ipv4 =
nullptr;
char str[32] = {0};
for (auto iter = pAddr; iter !=
nullptr; iter = iter->ai_next)
{
ipv4 = (struct
sockaddr_in*)iter->ai_addr;
inet_ntop(AF_INET, &ipv4->sin_addr, str, 32);
ips.push_back(str);
}
}
else
if(pAddr->ai_family ==
AF_INET6)
{
struct
sockaddr_in6* ipv6 =
nullptr;
char str[40] = {0};
for (auto iter = pAddr; iter !=
nullptr; iter = iter->ai_next)
{
ipv6 = (struct
sockaddr_in6*)iter->ai_addr;
inet_ntop(AF_INET6, &ipv6->sin6_addr, str, 40);
ips.push_back(str);
}
}
int nReady;
std::vector<std::string>
ipVector = ips;
if (pAddr->ai_family ==
AF_INET6)
{
for (auto iter = ipVector.begin(); iter!= ipVector.end();
iter++)
{
std::string ip = iter->c_str();
sockaddr_in6 sa = {0};
struct
in6_addr addr = {0};
inet_pton(pAddr->ai_family, ip.c_str(), &addr);
sa.sin6_family = pAddr->ai_family;
sa.sin6_port =
htons(m_wPort);
sa.sin6_addr = addr;
nReady = ::connect(m_sockClient, (sockaddr*)&sa,
sizeof(sa));
if (nReady == 0)
break;
}
}
else
{
std::string ip = ipVector.at(0);
sockaddr_in sa = {0};
struct
in_addr addr = {0};
inet_pton(pAddr->ai_family, ip.c_str(), &addr);
sa.sin_family = pAddr->ai_family;
sa.sin_port =
htons(m_wPort);
sa.sin_addr = addr;
nReady = ::connect(m_sockClient, (sockaddr*)&sa,
sizeof(sa));
}
freeaddrinfo(pAddr);
if( nReady !=
SOCKET_ERROR )
{
//接收线程
std::thread pSocketRecv(&CGameSocket::onThreadRecv,
this);
pSocketRecv.detach();
CCLOG("CTCPSocket: Connect Succeed");
}
相关文章推荐
- 升级支持ipv4/ipv6后的Socket处理(cocos2dx项目苹果审核支持ipv6处理二)
- 不使用Mac机器网络使用iPhone网络搭建ipv6测试环境(cocos2dx项目苹果审核支持ipv6处理一)
- 如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6
- 如何升级cocos2d-x来支持ipv6以及socket怎么支持ipv6
- aliyun支持ipv6的配置-苹果审核被拒的的破解之道
- 关于苹果审核,应用需支持IPV6的解决办法
- 给服务器添加 ipv6 支持 以通过苹果审核
- 网络编程:Socket编程从IPv4转向IPv6支持
- linux c socket之通用socket,支持ipv4和ipv6
- (转)网络编程:Socket编程从IPv4转向IPv6支持
- 如何升级cocos2d-x来支持ipv6以及socket怎么支持ipv6
- 函数项目【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)函数项目
- 苹果审核的Crash错误信息处理.
- Linux企业级项目实践之网络爬虫(28)——爬虫socket处理
- Linux命令精选-显示当前激活的tcp连接(支持IPv4和IPv6)
- 使用AndroidStudio部署Cocos2dx-Lua项目的处理方法
- 升级后cocos2dx项目创建失败,解决方案
- android java 在同时支持ipv4 与 ipv6 状况下,仅支持ipv4 或 ipv6的方法(测试中)
- ipv6 ipv4的socket编码的区别
- Cocos2dx 2.12版本升级之后,如何新建项目