#include
#include
#pragma comment(lib, "wsock32.lib")
using namespace std;
int main()
{
unsigned long IP;
IP =inet_addr("192.168.0.1");
cout << IP << endl;
system("Pause");
return 0;
}
1.1 出现错误:
错误 C4996 ‘inet_addr’: Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings DSN Domain Resolution H:\source\TCP\DSN Domain Resolution\DSN Domain Resolution\main.cpp 13
1.2 错误图片 :C4996
1.3 解决办法:更改SDL检查为否
#include
#include
#pragma comment(lib,"wsock.lib")
using namespace std;
int main()
{
unsigned long hostaddr=0xAABBCCDD; // 定义本机字节AABBCCDD
unsigned long netaddr; // 定义网络字节
netaddr=htonl(hostaddr); // 使用函数htonl()进行转换 host to net
cout<<"hostaddr:"<<hostaddr<<endl; // 输出hostaddr
cout<<"netaddr:"<<netaddr<<endl; // 输出netaddr
system("Pause");
return 0;
}
来源:《TCP/IP协议与网络编程》 任泰明 编著
DNS解析数据流动方向:
-> name 主机名字
-> aliase 主机别名
-> addrtype 地址类型
-> length 地址长度(字节)
-> addr_list[n]
addr_list[n](IP列表,IP地址是4个字节,32位,
这里获取的IP地址是网络字节顺序,
通过inet_ntoa(sa.sin_addr)函数,将其转换成点分十进制数表示的IP地址
注意:这里使用了memcpy()函数,直接复制32位内存,即IP地址,
猜想可能和小端方式,大端方式有关,
即无论我是小端方式,还是大端方式,都直接复制过来。
但windows系统规定了是小端方式,
所以,它的转换函数inet_ntoa(sa.in_addr)也是针对小端方式来设计的)
#include
#include
#include
#pragma comment(lib, "wsock32.lib")
int main()
{
WSADATA wsaData;
int n;
// 存放主机名称
char hostname[256];
// 主机信息指针
hostent* pHostent;
// 主机协议信息指针
protoent* pProtoent;
// sockaddr_in结构指端口和IP地址信息
struct sockaddr_in sa;
// 其实 不用struct也能够成功执行
// sockaddr_in sa;
if (WSAStartup(MAKEWORD(2, 2), &wsaData )!= 0)
{
printf("Failed to load Winsock.\n");
return -1;
}
printf("-----------------------------------------------\n");
// 获得主机名
if (gethostname(hostname, sizeof(hostname)) != 0)
{
printf("gethostname() Error:%u\n",WSAGetLastError());
return -2;
}
printf("以下信息由gethostname()函数取得\n");
printf("Local host name:%s\n",hostname);
printf("------------------------------------------------\n");
// 根据主机名获取主机信息
pHostent = gethostbyname(hostname);
if (pHostent == NULL)
{
printf("gethostbyname()Error:%u\n",WSAGetLastError());
return -3;
}
// 解析返回的hostent结构中名称、别名、地址类型和地址长度信息
printf("以下信息由gethostbyname()函数取得\n");
printf("name:%s\naliases:%s\naddrtype:%d\nlength:%d\n",
pHostent->h_name,
pHostent->h_aliases,
pHostent->h_addrtype,
pHostent->h_length);
// 解析hostent结构中的主机地址
for (n = 0; pHostent->h_addr_list[n]; n++)
{
// memcpy函数在C/C++中都可以使用 内存拷贝函数
/*
memcpy指的是C和C++使用的内存拷贝函数,
函数原型为void *memcpy(void *destin, void *source, unsigned n);
函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,
即从源source中拷贝n个字节到目标destin中。
*/
memcpy(&sa.sin_addr.s_addr,pHostent->h_addr_list[n],pHostent->h_length);
// 输出主机IP地址。
printf("Address:%s\n",inet_ntoa(sa.sin_addr));
}
printf("-------------------------------------------------\n");
// 根据协议名获得协议信息
pProtoent = getprotobyname("tcp");
if (pProtoent == NULL)
{
printf("getprotobyname()Error:%u\n", WSAGetLastError());
return -4;
}
// 解析protoent结构中的信息
printf("以下信息由getprotobyname()函数取得\n");
printf("name:%s\nproto:%d\n",
pProtoent->p_name,
pProtoent->p_proto);
for (n = 0; pProtoent->p_aliases[n]; n++)
{
printf("aliases:%s\n",pProtoent->p_aliases[n]);
}
WSACleanup();
system("Pause");
return 0;
}
# pragma comment(lib, "wsock32.lib")
一、C++ 空项目
# include
# include
#pragma comment(lib,"ws2_32.lib")
int main()
{
WORD wVersionRequested;
WSAData wsaData;
wVersionRequested = MAKEWORD(2, 2);
// 打开winsock WSAData
if (WSAStartup(wVersionRequested, &wsaData) != 0)
{
// Winsock 初始化错误 !
// 输出Winsock初始化错误信息,如“WSAStartup failed”
MessageBox(NULL, "Initialization error!\n WSAStartup failed!", "Intialization error!", 0);
return -1;
}
// 以下两种方法中的任意一种进行版本号匹配的检查
// 版本号是两字节
// 判断高字节HIBYTE==2 低字节LOBYTE==2
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
MessageBox(NULL, "Winsock2装载的版本不对!", "WSAStartup", 0);
WSACleanup();
return -1;
}
char data[400];
sprintf_s(data, 400, "WSAStartup装载成功!\n版本是:%d,%d\n描述:%s\n状态:",
HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion), wsaData.szDescription, wsaData.szSystemStatus);
MessageBox(NULL, data, "装载WSAStartup", 0);
WSACleanup();
return 0;
}
#include
#include
#pragma comment(lib,"ws2_32.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WORD wVersionRequested;
WSAData wsaData;
wVersionRequested = MAKEWORD(2, 2);
// 打开winsock WSAData
if (WSAStartup(wVersionRequested, &wsaData) != 0)
{
// Winsock 初始化错误 !
// 输出Winsock初始化错误信息,如“WSAStartup failed”
MessageBox(NULL, "Initialization error!\n WSAStartup failed!","Intialization error!",0);
return -1;
}
// 以下两种方法中的任意一种进行版本号匹配的检查
// 版本号是两字节
// 判断高字节HIBYTE==2 低字节LOBYTE==2
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
MessageBox(NULL, "Winsock2装载的版本不对!", "WSAStartup", 0);
WSACleanup();
return -1;
}
char data[400];
sprintf_s(data,400,"WSAStartup装载成功!\n版本是:%d,%d\n描述:%s\n状态:%s",
HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion),wsaData.szDescription,wsaData.szSystemStatus);
MessageBox(NULL,data ,"装载WSAStartup",0);
WSACleanup();
return 0;
}