第二章 Winsock编程接口(1)

第一章的一大堆理论知识,以后补上,先敲点小代码过过瘾。

winsock是windows下网络编程的标准接口,使用winsock开发网络应用程序,需要包含相关头文件和链接库文件。

#include

#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 lpWSADataWSADATA结构的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。

卸载:int WSACleanup(void);比起加载,卸载的函数真是轻松愉快。

每个网络应用程序的开发都要使用winsock的加载和卸载,每写一个都要重新编码不是麻烦的要死?总不能每次都复制粘贴吧。

用C++封装成一个类就方便多了。

#include 
#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

CInitSock initSock;;

就能完成加载与卸载。


获取主机所有ip地址代码:

#include 
#include 

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库加载和卸载以及一个小示例。

你可能感兴趣的:(第二章 Winsock编程接口(1))