ipv4和ipv6在socket初始化的时候是不一样的。

ipv4 socket初始化:

int CClient::InitSocket(CString strIP, short portNum)
{
WSADATA wsd;
SOCKADDR_IN servAddr;
int retVal;
//初始化套结字动态库
if (WSAStartup(MAKEWORD(, ), &wsd) != )
{
return -;
}
//创建套接字
m_sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_sHost)
{
WSACleanup();//释放套接字资源
return -;
} //设置服务器地址
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr((LPCTSTR)strIP);
servAddr.sin_port = htons(portNum);
int nServAddlen = sizeof(servAddr); //设置非阻塞方式连接
unsigned long ul = ;
retVal = ioctlsocket(m_sHost, FIONBIO, (unsigned long*)&ul);
if (retVal == SOCKET_ERROR) return ; //连接服务器
retVal = connect(m_sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr)); if (retVal == )
{ }
else
{
int iErr = GetLastError();
if (WSAEWOULDBLOCK == iErr)
{
struct timeval timeout;
fd_set r; FD_ZERO(&r);
FD_SET(m_sHost, &r);
timeout.tv_sec = ;
timeout.tv_usec = ;
retVal = select(m_sHost + , NULL, &r, NULL, &timeout);
if (retVal <= )
{
closesocket(m_sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -;
}
}
} //退出
return ;
}

ipv6 socket初始化:

int CClient::InitSocket(CString strIP, short portNum)
{
WSADATA wsd;
struct sockaddr_in6 servAddr_in6;
int retVal;
int nServAddlen; //初始化套结字动态库
if (WSAStartup(MAKEWORD(, ), &wsd) != )
{
return -;
} sprintf_s(m_szIP, sizeof(m_szIP), strIP); memset(&servAddr_in6, , sizeof(struct sockaddr_in6)); //创建套接字
m_sHost = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_sHost)
{
return -;
} //设置服务器地址
servAddr_in6.sin6_family = AF_INET6; if (!inet_pton(AF_INET6, m_szIP, &servAddr_in6.sin6_addr.s6_addr))
{
closesocket(m_sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -;
} //设置非阻塞方式连接
unsigned long ul = ;
retVal = ioctlsocket(m_sHost, FIONBIO, (unsigned long*)&ul);
if (retVal == SOCKET_ERROR) return ; servAddr_in6.sin6_port = htons(portNum);
nServAddlen = sizeof(servAddr_in6);
//连接服务器
retVal = connect(m_sHost, (LPSOCKADDR)&servAddr_in6, (socklen_t)nServAddlen); if (retVal == )
{ }
else
{
int iErr = GetLastError();
if (WSAEWOULDBLOCK == iErr)
{
struct timeval timeout;
fd_set r; FD_ZERO(&r);
FD_SET(m_sHost, &r);
timeout.tv_sec = ;
timeout.tv_usec = ;
retVal = select(m_sHost + , NULL, &r, NULL, &timeout);
if (retVal <= )
{
closesocket(m_sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -;
}
}
} //退出
return ;
}

将上面的逻辑合二为一:

int CClient::InitSocket(CString strIP, short portNum)
{
WSADATA wsd;
struct sockaddr_in6 servAddr_in6;
SOCKADDR_IN servAddr;
int retVal;
int nServAddlen; //初始化套结字动态库
if (WSAStartup(MAKEWORD(, ), &wsd) != )
{
return -;
} sprintf_s(m_szIP, sizeof(m_szIP), strIP); memset(&servAddr, , sizeof(servAddr));
memset(&servAddr_in6, , sizeof(struct sockaddr_in6)); //设置非阻塞方式连接
unsigned long ul = ;
retVal = ioctlsocket(m_sHost, FIONBIO, (unsigned long*)&ul);
if (retVal == SOCKET_ERROR) return ;
if (TRUE == is_string_ipaddr_ipv4(m_szIP, &servAddr.sin_addr))
{
//创建套接字
m_sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_sHost)
{
WSACleanup();//释放套接字资源
return -;
} //设置服务器地址
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(m_szIP);
servAddr.sin_port = htons(portNum);
nServAddlen = sizeof(servAddr);
//连接服务器
retVal = connect(m_sHost, (LPSOCKADDR)&servAddr, (socklen_t)nServAddlen);
}
else
{
//创建套接字
m_sHost = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_sHost)
{
return -;
} //设置服务器地址
servAddr_in6.sin6_family = AF_INET6; if (!inet_pton(AF_INET6, m_szIP, &servAddr_in6.sin6_addr.s6_addr))
{
closesocket(m_sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -;
}
servAddr_in6.sin6_port = htons(portNum);
nServAddlen = sizeof(servAddr_in6);
//连接服务器
retVal = connect(m_sHost, (LPSOCKADDR)&servAddr_in6, (socklen_t)nServAddlen);
} if (retVal == )
{ }
else
{
int iErr = GetLastError();
if (WSAEWOULDBLOCK == iErr)
{
struct timeval timeout;
fd_set r; FD_ZERO(&r);
FD_SET(m_sHost, &r);
timeout.tv_sec = ;
timeout.tv_usec = ;
retVal = select(m_sHost + , NULL, &r, NULL, &timeout);
if (retVal <= )
{
closesocket(m_sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -;
}
}
} //退出
return ;
}

判断一个ip是不是ipv4的

/*判断传入的字符串是否为ipv4格式的
*/
bool CClient::is_string_ipaddr_ipv4(const char* str_ipv4, struct in_addr *ip)
{
int32 ret = -;
struct in_addr tmp_ip; memset(&tmp_ip, , sizeof(struct in_addr)); if (NULL == str_ipv4)
{
return false;
} if ( == *str_ipv4)
{
return false;
} ret = inet_pton(AF_INET, str_ipv4, &tmp_ip);
if ( == ret)
{
return false;
}
else if (ret < )
{
return false;
}
else
{
if (NULL != ip)
{
memcpy(ip, (void *)&tmp_ip, sizeof(struct in_addr));
} return true;
}
}

支持ipV6和ipV4的客户端编程的更多相关文章

  1. keepalive配置支持ipv6、ipv4双棧支持

    因公司业务需要,keepalived需要同时支持ipv6和ipv4 keepalived版本1.2.23. keepalived 配置: 重点:ipv6的虚IP配置在 virtual_ipaddres ...

  2. iOS应用支持IPV6,就那点事儿

    原文连接   果然是苹果打个哈欠,iOS行业内就得起一次风暴呀.自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6 ...

  3. iOS应用支持IPV6

    一.IPV6-Only支持是啥? 首先IPV6,是对IPV4地址空间的扩充.目前当我们用iOS设备连接上Wifi.4G.3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IP ...

  4. OSS支持IPV6/IPV4双栈访问域名

    摘要: OSS开放IPv6/IPv4双栈域名,可同时支持IPv6/IPv4客户端的访问,支持下一代互联网技术IPv6,可服务海量物理网设备连接等应用场景. 下一代IP协议 IPv4地址已接近枯竭,被誉 ...

  5. iOS 支持 IPv6

    苹果的规定:2016年6月1日提交到App Store必须支持IPv6-only网络. 官方文档:https://developer.apple.com/library/mac/documentati ...

  6. PPTP支持IPv6

    pptp支持ipv6,谷歌资料不多,这里整理下   主要用来给ipv4访问ipv6资源的场景使用,客户端连接上pptp后会分配得到一个ipv6地址,通过此地址访问ipv6的资源 客户端网段在pptp. ...

  7. HP-Socket v5.0.1:支持 IPv6 及多 SSL 证书

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  8. 配置阿里云ECS支持IPv6,解决苹果app审核失败问题

    前几天iOS的App提交给苹果审核没通过,给出的原因是:该应用在 IPv6 的环境下无法使用.检查发现:阿里云优化过的系统没有启用IPv6协议,需要配置启用一下,但是只单独启用IPv6也是无法直接提供 ...

  9. 成功扩展live555支持ipv6,同时支持RTSPServer & RTSPClient

    live555对ipv6的扩展 从live555的官网看live555的发展历史,实在是历史悠久,保守估计已经发展了至少16年以上了,同时,这也导致了live555在很多架构和考虑上面不能满足现代化的 ...

随机推荐

  1. python_20_socket

    什么是socket? -- 通过各种协议,发送和接收数据,实现网络通信 -- 在python3中,网络发送只能发二进制数据 OSI七层模型是什么? 应用 表示 会话 传输 网络             ...

  2. ClearCase新增文件

    原文地址:http://blog.csdn.net/ace_fei/article/details/7531376 大家应该都知道在clearcase上新增文件是通过以下过程来生成的: clearto ...

  3. Android自定义View的套路

    一.自定义View的流程 1.属性设置 在styles.xml中设置控件属性,如果你想直接harcode可以忽略这步 <!--name为声明的"属性集合"名,可以随便取,但是 ...

  4. CentsOS7无网情况下安装mysql5.7

    1.需求就不用讲了,客户现场,政府环境,银行环境,大多是没网的,所以无网安装是很有必要的 mysql下载路径:https://dev.mysql.com/downloads/mysql/ 查看自己Li ...

  5. MongoDB 基本操作学习笔记

    // 查看所有数据库 show dbs // amdin 0.000GB // local 0.000GB // 使用数据库 use admin // switched to db admin // ...

  6. Tomcat修改端口号(7.0 version)

    目的:有时端口号可能其他服务占用,就需要修改一下Tomcat的端口号,避免冲突. 自我总结,有什么需要改正的地方,请大家补充,感激不尽! 找到Tomcat的的配置文件server.xml 路径:%to ...

  7. 编译和解释性语言和python运行方式

    1.编译型语言和解释性语言 编译型语言:在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了.程序执行效率高,依赖编译器,跨平台性差些.如C. ...

  8. Tensorflow ActiveFunction激活函数解析

    Active Function 激活函数 原创文章,请勿转载哦~!! 觉得有用的话,欢迎一起讨论相互学习~Follow Me Tensorflow提供了多种激活函数,在CNN中,人们主要是用tf.nn ...

  9. HTTP/HTTPS GET&POST两种方式的实现方法

    关于GET及POST方式的区别请参照前面文章:http://www.cnblogs.com/hunterCecil/p/5698604.html http://www.cnblogs.com/hunt ...

  10. windows下安装配置python + selenium 来驱动firefox

    第一步,首先下载安装python ,我下载的是3.5版本,这个版本,自带了pip工具,不需要安装pip了 :) 链接地址:python 3.5 第二步,执行pip install selenium 安 ...