第一章的一大堆理论知识,以后补上,先敲点小代码过过瘾。
winsock是windows下网络编程的标准接口,使用winsock开发网络应用程序,需要包含相关头文件和链接库文件。
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
winsock库的加载与卸载:
加载:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
加载成功,返回值为0。
WORD wVersionRequested:加载的winsock版本,使用宏MAKEWORD(x, y),x表示高字节,y表示低字节。然而使用时MAKEWORD(2, 2)。高字节与低字节相同~~
LPWSADATA lpWSAData:WSADATA结构的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。
卸载:int WSACleanup(void);比起加载,卸载的函数真是轻松愉快。
每个网络应用程序的开发都要使用winsock的加载和卸载,每写一个都要重新编码不是麻烦的要死?总不能每次都复制粘贴吧。
用C++封装成一个类就方便多了。
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
class CInitSock
{
public:
CInitSock(BYTE bMinVer=2, BYTE bMaxVer=2)
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(bMinVer, bMaxVer), &wsaData) != 0)
{
exit(0);
}
}
~CInitSock()
{
WSACleanup();
}
};
把写好的头文件放在include目录下,每次使用的时候:
#include <InitSock.h>
CInitSock initSock;;
就能完成加载与卸载。
获取主机所有ip地址代码:
#include <InitSock.h>
#include <stdio.h>
CInitSock initSock;
int main()
{
char szHost[256];
//得到主机名
gethostname(szHost, 256);
//得到地址信息
hostent *pHost = gethostbyname(szHost);
in_addr addr;
for (int i = 0; ; i++)
{
char *p = pHost->h_addr_list[i];
if (p == NULL)
break;
memcpy(&addr.S_un.S_addr, p, pHost->h_length);
char *szIp = inet_ntoa(addr);
printf("本机IP地址:%s \n",szIp);
}
return 0;
}
char * inet_ntoa(struct in_addr in);将32位的二进制数转化成字符串。
(1)的主要内容是winsock库加载和卸载以及一个小示例。