[Win32] Windows Sockets 2笔记(1)在开始之前

 本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/47998329

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 <winsock2.h>
#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 获取扩展代码。

WSACleanup函数:
int WSACleanup(void);
用于关闭Windows Socket 2



你可能感兴趣的:(Win32,windows,api,winsock2,winapi)