php websocket ipv6,原生socket支持ipv6

以前cocos2d-x的项目里都使用的是libwebsocket,如果想支持ipv6,只需要升级相应的库即可,现在有个项目里使用的是原生socket,如果要支持ipv6可能需要进行一些代码的改造,具体可参考如下代码:

struct addrinfo *result;

struct addrinfo *res;

struct addrinfo addrCriteria;

memset(&addrCriteria,0,sizeof(addrCriteria));

addrCriteria.ai_family=AF_UNSPEC;

addrCriteria.ai_socktype=SOCK_STREAM;

addrCriteria.ai_protocol=IPPROTO_TCP;

//判定网络类型 指定特定接口信息

int error = getaddrinfo("www.baidu.com", "1100", &addrCriteria, &result);

if (error == 0)

{

struct sockaddr_in *sa;

for (res = result; res != NULL; res = res->ai_next)

{

if (AF_INET6 == res->ai_addr->sa_family)

{

char buf[128] = {};

sa = (struct sockaddr_in*)res->ai_addr;

inet_ntop(AF_INET6, &((reinterpret_cast(sa))->sin6_addr), buf, 128);

m_sock = socket(res->ai_family, res->ai_socktype, 0);

if (m_sock == -1) {

log("error socket create");

return;

}

struct sockaddr_in6 svraddr;

memset(&svraddr, 0, sizeof(svraddr)); //注意初始化

svraddr.sin6_family = AF_INET6;

svraddr.sin6_port = htons(port);

if (inet_pton(AF_INET6,buf,&svraddr.sin6_addr) < 0)

{

log("error addr");

}

int ret = connect(m_sock, (struct sockaddr*) &svraddr, sizeof(svraddr));

//TODO....遇到IPv6就退出

break;

}

else if (AF_INET == res->ai_addr->sa_family)

{

char buf[32] = {};

sa = (struct sockaddr_in*)res->ai_addr;

inet_ntop(AF_INET, &sa->sin_addr), buf, 32);

m_sock = socket(res->ai_family, res->ai_socktype, 0);

if (m_sock == -1) {

log("error socket create");

return;

}

struct sockaddr_in svraddr;

svraddr.sin_family = AF_INET;

svraddr.sin_addr.s_addr = inet_addr(buf);

svraddr.sin_port = htons(port);

int ret = connect(m_sock, (struct sockaddr*) &svraddr, sizeof(svraddr));

//TODO.... break除掉

//break;

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值