对应OSI七层网络模型[11],Winsock工作在传输层和网络层,主要负责控制数据的输入和输出。由于Winsock屏蔽了数据链路层和物理层,使得应用程序不必考虑底层结构只要直接调用Winsock的API便可实现相互之间的通信[12],这给Windows下的网络编程带来了巨大的方便。
2.2.1 流式套接字模型
流式套接字方式对应传输层的TCP协议,是面向连接的,提供了双向的、有序的、无重复的数据流服务。在这种方式下,两个应用程序在通信前先要建立连接。只有通信的一端与另一端建立连接后,数据才能被正确接收和发送。由于这种方式是面向连接的,所以它可以按顺序无重复的将数据发送到目的端,确保了数据传输的可靠性。鉴于流式套接字通信可靠的特点,且对数据有校验和重发的机制,通常用于文件传输。使用流式套接字时,服务器首先要创建一个用于监听的套接字,调用bind函数将其绑定到一个公共的服务器端口上,然后调用listen()函数使它处于监听状态,等待客户端发起连接;客户端在创建套接字后调用connect()函数,请求与服务器连接;服务器套接字收到连接请求后,调用accept()函数接受此连接请求并建立一个新的套接字来与对方通信,称为会话套接字;原来的监听套接字继续监听,等待其他的连接请求,而新建立的套接字才是与客户端实际进行通信的套接字;通信结束后,客户端调用closesocket()函数关闭套接字,服务器也调用此函数关闭监听套接字和会话套接字,释放资源。