每次写网络程序都必须编写代码载入和释放winsock库,为了以后方便使用,我们将封装一个CInitSock类来管理Winsock库
#include<WinSock2.h>
#pragma comment(lib,"WS2_32")
class CInitSock
{
public:
CInitSock(BYTE minorVer=2,BYTE majorVer=2)
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(minorVer,majorVer);
if(WSAStartup(sockVersion,&wsaData)!=0)
{
exit(0);
}
}
~CInitSock()
{
WSACleanup();
}
};
WSADATA 这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据。它包含Winsock.dll 执行的数据。
WSAStartup
WSACleanup
#include"initsock.h"
#include<iostream>
using std::cout;
using std::endl;
CInitSock initSock;
void IP()
{
int i;
char szHost[256];
gethostname(szHost,256);
hostent *pHost=gethostbyname(szHost);
in_addr addr;
char *p=pHost->h_addr_list[0];
memcpy(&addr.S_un.S_addr,p,pHost->h_length);
char *szIp=inet_ntoa(addr);
cout<<szIp<<endl;
}
int main()
{
IP();
system("pause");
return 0;
}
gethostname() 返回本地主机的标准主机名。
int PASCAL FAR gethostname(char FAR *name, int namelen);
name: 一个指向将要存放主机名的缓冲区指针。
namelen:缓冲区的长度。
hostent
#define h_addr h_addr_list[0]
struct hostent {
};
memcpy
extern void *memcpy(void *destin, void *source, unsigned n);
由source指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。