第1页共16页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第1页共16页Winsocket入门教程一:多线程阻塞式服务器和阻塞式客户端程序(TCP)收藏最近因为工作需要学习了Winsocket客户端服务器模型程序的设计。在学习的过程中,我发现学习Winsocket的资料不多并且十分的零散。我一直没有找到一本学习Winsocket方面的经典国外著作。而且这些资料中并没有提供源代码文件,所以我只有将这些源代码在自己敲一遍。在敲代码的过程中,我发现了这些源代码中的一些错误的地方和一些已经过时的Windows程序的输写方法(Win16?)。现将学习经验和通过阅读各种资料总结出来的模型以及代码分享出来。希望对学习Winsocket的初学者有一定的帮助。我们首先来了解一下什么是Winsocket。Winsocket是unix/linux下的berkeleysocket在Windows下的实现。unix/linux下的berkeleysocket是网络通讯方面的基石,应用程序通过调用berkeleysocket的API进行相互通讯,berkeleysocket则利用具体的网络通讯协议和操作系统的调用来为我们完成具体的通讯工作。Winsocket保留了berkeleysocket的所有内容,并且为了其能在Win32消息机制和多线程的环境下更好的工作。Winsocket在berkeleysocket原有的基础上对其进行了扩充。如我们可以利用WSAAsyncSelect对Socket消息进行订阅,以及使用WSAGetLastError对多线程环境下的Winsocket错误进行捕获。接着再让我们来了解一下服务器\客户端应用程序模型。该模型是构建分布式系统的模型之一。服务器程序一直处于监听的状态,等待客户端程序的连接。客户端程序像服务器程序发送连接请求,服务器程序接受该连接请求,同时与客户端程序建立连接。此时客户端程序就可以向服务器发送具体的请求,获取相关的数据。服务器\客户端模型有三种连接方式,一种是面向连接的(TCP),面向连接的服务是一种可靠的服务,它通过数据流进行数据的传输,面向连接的服务实现了无差错无重复的顺寻数据发送。一种是面向无连接的(UDP),面向无连接的服务是一种不可靠的服务,它通过数据报进行数据传输,由于数据报进行传输时的顺序是无序的,所以它是不可靠的服务。最后一种是多播的方式,及服务器程序主动向多个客户端程序发送信息。面向连接的服务器\客户端应用程序模型的程序流程图如下所示:第2页共16页第1页共16页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第2页共16页在此模型的阻塞模式中,服务端程序在执行accept操作、客户端程序connect操作、以及服务端\客户端在进行read和write操作时,如果这些操作既没有成功也没有失败,应用程序会在执行这些操作的地方一直阻塞着。所以我们应该在服务端应用程序的主线程中不停的调用accept操作,以使服务端程序能不停地接受客户端程序发送过来的连接请第3页共16页第2页共16页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第3页共16页求。而在接受了一个客户端的连接请求后,我们应改为每一个接受的连接请求开辟一个专门的线程来接受客户端程序发送的请求以及为具体的请求返回特定的信息。根据以上的程序流程图以及说明,我们可以写出以下的服务端程序源代码:viewplaincopytoclipboardprint?1.////////////////////////////////////////////////////////////////////////////////////////////////////2.///\fileServerMultThread\ServerMultThread.cpp3.///4.///\brief阻塞式多线程服务器程序。每当客户端程序请求与服务端连接时,服务端程序开放一个线程接受客户端程序的请求5.///并且向客户端回馈请求的信息。客户端请求的信息输出到控制台中.6.////////////////////////////////////////////////////////////////////////////////////////////////////7.#include
8.#include9.#include10.#include11.#pragmacomment(lib,"ws2_32.lib")12.#defineASSERTassert13.#defineTHREADHANDLE14.#defineEVENTHANDLE15.#defineCloseThreadCloseHandle16.#defineCloseEventCloseHandle17.usingstd::cin;18.usingstd::cout;19.usingstd::endl;20./////////////////////////...