Window的网络编程主要是利用WinSock,这是一种标准的API,注意它是编程接口,而不是网络协议。目前已经有两个版本WinSock1和WinSock2。在实际使用时必须包含相应的头文件和库,前者是Winsock.h, MSWsock.h/MSWsock.dll以及WSock32.lib,后者用Winsock2.h及WS2_32.LIB。
如果不想设置包含关系,可以在程序里面加上以下:
#pragma comment (lib, "ws2_32.lib")
使用WinSock之前必须初始化库,结束必须清理,以下是一个框架:
IP地址在WinSock中用SOCKADDR_IN结构体来描述。不同的计算机采用ig-endian和little-endian形式进行编号,例如Intel86处理器上,多字节编号用little-endian形式表示,即字节的排序是从最无意义的字节到最有意义的字节。
- 在计算机中把Ip地址和端口号指定成多字节时,是按主机字节(host-byte)顺序表示;
- 在网络上指定IP地址和端口号时指定多字节时,必须用big-endian形式,即网络字节(network-byte)顺序,也即从最有意义字节开始。
因此,在设置IP地址时,需要进行一下字节转换。有许多API函数可以用于此作用:
下面是将一个数从host-byte转换成network-byte: htonl, WSAHtonl, htons, WSAHtons
下面是逆向转换的:ntohl, ntohs, WSANtohl, WSANtohs
下面一段代码是演示如何绑定IP地址:
创建套接字:在Windows中,套接字与文件描述符不是一回事,是一个独立的类型,即SOCKET类型,其创建方法有两个函数:socket和WSASocket。
Socket socket(int af, int type, int protocol)
其中af设为AF_INET,type的类型对于Tcp来说是SOCK_STREAM,对于uDP来说是SOCK_DGRAM。Protocol的取值也有两个:IPPROTO_TCP或IPPROTO_UDP。
创建后,即要将端口与IP地址及端口绑定,可以用bind函数。
以下图形比较好的描述了通信双方的实现流程:
整体来说,第一章就是介绍了利用WinSOCK编程常用的一些API函数,这部分内容查阅MSDN即可。