Winsock2(Windows Sockets 2)是Windows上的套接字,但是没有Raw Socket,从XP开始,应用程序就不能再使用完整的原始套接字了,只允许内核程序(比如设备驱动)使用。
但是如果我们只想进行TCP、UDP的网络通信,Winsock2不一定最简单(比如HTTP、FTP用wininet更简单),但一定能解决问题,如果想要自定义应用层协议,或者自己设计一个应用层协议,无疑Winsock2是最好的选择。
Windows内核协议栈是如何运作的我们无从得知,但是这对我们来说并不需要,因为我们只需关心Socket接口即可。数据的发送和接收由协议实现。
在开始之前,我希望大家能先来了解一下基本的网路知识:
1。TCP协议(传输控制协议)是一种面向连接的、可靠的协议,TCP协议有他自己的校检、超时重发机制,TCP注射也很难完成,简单说,通过TCP协议传输的数据是不需要进行完整性检验的,比如说我下载一个文件,难道还用担心文件数据缺失或不正确吗,当然前提是在没有hacker捣蛋的情况下。为什么SSL、HTTPS那么流行?虽然TCP协议是面向连接的、可靠的协议,但不代表它安全,TCP保证的是接收端能够完整地接收发送端的数据,他没有检测发送端是否真实的能力。(这里的发送端和接收端不是一次TCP连接的某一端,而是泛指,在一次TCP连接中,两个主机都即是发送端也是接收端)
2。UDP协议(用户数据报协议)是一种非连接、不可靠的协议,发送端只负责把数据发出去,至于说接收端能否收到就不管了。但UDP有一个特点,它可以广播或多播数据,而TCP是不能的。简单说,我可以将一份UDP数据报直接发送到子网内的每一台主机上。
3。IP协议(网际协议)是一种非连接、不可靠的协议,TCP、UDP基于IP,IP协议不可靠,可靠性只能由他的上层协议实现。
4。ICMP协议(Internet控制报文协议)大名鼎鼎的Ping程序,就是使用ICMP协议实现的,严格说ICMP协议是IP协议的子协议,也是基于IP协议的。
开启Winsock2的方法,方法几乎是死的:
首先包含头文件、定义要连接的库
#include
#pragma comment(lib , "Ws2_32.lib")
注意这个一定要写在Windows.h的前面,否则会出错。
开启Windows Socket 2:
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);
if (WSAStartup(wVersionRequested, &wsaData) != 0){
MessageBox(NULL, TEXT("Winsock开启失败"), TEXT("错误"), MB_ICONERROR);
return 1;
}
来简单解释一下:
WSAStartup函数:
int WSAStartup(
_In_ WORD wVersionRequested,
_Out_ LPWSADATA lpWSAData
);
用于开启Windows Socket 2
wVersionRequested:高序位字节指定版本号,低序位字节指定的主版本号。
lpWSAData:指向要接收 Windows 套接字实现的细节的 WSADATA 数据结构的指针。一般用不到。
返回值:如果成功,则 WSAStartup 函数返回零。否则,它将返回一个错误代码。WSAGetLastError 获取扩展代码。
int WSACleanup(void);
用于关闭Windows Socket 2