本博客轉載別人的,還沒經過本人驗證~
IPv4初始化過程:
int CClient::InitSocket(CString strIP, short portNum)
{
WSADATA wsd; //WSADATA變量
SOCKADDR_IN servAddr; //服務器地址
int retVal; //返回值
int nServAddlen;
//初始化套結字動態庫
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
return -1;
}
sprintf_s(m_szIP, sizeof(m_szIP), strIP);
memset(&servAddr, 0, sizeof(servAddr));
//創建套接字
m_sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_sHost)
{
WSACleanup();//釋放套接字資源
return -1;
}
//設置服務器地址
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);
if (SOCKET_ERROR == retVal)
{
closesocket(m_sHost); //關閉套接字
WSACleanup(); //釋放套接字資源
return -1;
}
return 0;
}
IPv6初始化過程:
int CClient::InitSocket(CString strIP, short portNum)
{
WSADATA wsd; //WSADATA變量
struct sockaddr_in6 servAddr_in6; //服務器地址
int retVal; //返回值
int nServAddlen;
//初始化套結字動態庫
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
return -1;
}
sprintf_s(m_szIP, sizeof(m_szIP), strIP);
memset(&servAddr_in6, 0, sizeof(struct sockaddr_in6));
//創建套接字
m_sHost = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_sHost)
{
return -1;
}
//設置服務器地址
servAddr_in6.sin6_family = AF_INET6;
if (!inet_pton(AF_INET6, m_szIP, &servAddr_in6.sin6_addr.s6_addr))
{
closesocket(m_sHost); //關閉套接字
WSACleanup(); //釋放套接字資源
return -1;
}
servAddr_in6.sin6_port = htons(portNum);
nServAddlen = sizeof(servAddr_in6);
//連接服務器
retVal = connect(m_sHost, (LPSOCKADDR)&servAddr_in6, (socklen_t)nServAddlen);
if (SOCKET_ERROR == retVal)
{
closesocket(m_sHost); //關閉套接字
WSACleanup(); //釋放套接字資源
return -1;
}
//退出
return 0;
}
IPv4和IPv6合併處理:
int CClient::InitSocket(CString strIP, short portNum)
{
WSADATA wsd; //WSADATA變量
struct sockaddr_in6 servAddr_in6; //服務器地址
SOCKADDR_IN servAddr; //服務器地址
int retVal; //返回值
int nServAddlen;
//初始化套結字動態庫
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
return -1;
}
sprintf_s(m_szIP, sizeof(m_szIP), strIP);
memset(&servAddr, 0, sizeof(servAddr));
memset(&servAddr_in6, 0, sizeof(struct sockaddr_in6));
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 -1;
}
//設置服務器地址
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 -1;
}
//設置服務器地址
servAddr_in6.sin6_family = AF_INET6;
if (!inet_pton(AF_INET6, m_szIP, &servAddr_in6.sin6_addr.s6_addr))
{
closesocket(m_sHost); //關閉套接字
WSACleanup(); //釋放套接字資源
return -1;
}
servAddr_in6.sin6_port = htons(portNum);
nServAddlen = sizeof(servAddr_in6);
//連接服務器
retVal = connect(m_sHost, (LPSOCKADDR)&servAddr_in6, (socklen_t)nServAddlen);
}
if (SOCKET_ERROR == retVal)
{
closesocket(m_sHost); //關閉套接字
WSACleanup(); //釋放套接字資源
return -1;
}
//退出
return 0;
}
判斷IP是IPv4或IPv6:
/*判斷傳入的字符串是否爲ipv4格式的
*/
bool CClient::is_string_ipaddr_ipv4(const char* str_ipv4, struct in_addr *ip)
{
int32 ret = -1;
struct in_addr tmp_ip;
memset(&tmp_ip, 0, sizeof(struct in_addr));
if (NULL == str_ipv4)
{
return false;
}
if (0 == *str_ipv4)
{
return false;
}
ret = inet_pton(AF_INET, str_ipv4, &tmp_ip);
if (0 == ret)
{
return false;
}
else if (ret < 0)
{
return false;
}
else
{
if (NULL != ip)
{
memcpy(ip, (void *)&tmp_ip, sizeof(struct in_addr));
}
return true;
}
}