Windows网络编程:套接字、服务与数据报
在网络编程领域,Windows Sockets提供了强大的功能,可用于构建各种客户端/服务器应用系统。下面将详细介绍Windows Sockets的相关知识,包括线程安全的DLL策略、数据报的使用、与Berkeley Sockets的对比、重叠I/O以及Windows服务等内容。
1. 线程安全的DLL策略
在开发线程安全的库函数时,有不同的策略可供选择。
1.1 传统策略的问题
传统的将TLS和其他技术结合创建线程安全库的方式,如Program 12 - 5,存在一些弱点。首先,状态与线程关联而非与套接字关联,导致一个线程一次只能处理一个套接字;其次,存在资源泄漏的风险,例如某些线程(如接受线程)可能永远不会终止,从而无法从DLL中分离。
1.2 替代策略
一种有效的替代方法是创建一个类似句柄的结构,并将其传递给每个函数调用。状态将保存在该结构中,应用程序可以显式管理状态,这样一个线程就可以管理多个套接字,甚至可以在纤程中使用套接字。许多UNIX和Linux应用程序使用这种技术创建线程安全的C库,不过缺点是函数需要额外的状态结构参数。
Program 12 - 6对Program 12 - 5进行了修改,不再需要某些特定的操作,但新增了两个用于初始化和释放状态结构的函数,发送和接收函数只需进行最小的更改。相关的服务器程序在示例文件中,只需进行轻微修改即可创建和关闭套接字句柄。
2. 数据报(Datagrams)
数据报类似于邮件槽,在相似的场景中使用。发送方和接收方之间没有连接,并且可以有多个接收方。无