4

我正在使用在http://tangentsoft.net/wskfaq/examples/basics/select-server.html找到的这个示例实现

这完成了我需要的大部分工作,处理连接而不阻塞,并且在其线程中完成所有工作(不像某些示例那样为每个连接创建一个新线程),但我很担心,因为我被告知 winsock 只会支持最多 64 个客户端连接:S

这64个连接是真的吗?

我还有什么其他选择?有一个类似实现的 c++ 示例会很酷。

谢谢

4

3 回答 3

6

替代库:

您应该考虑使用boost asio。它是一个跨平台的网络库,可以简化您可能需要完成的许多任务。

您可以在此处找到您需要的示例源代码


关于 64 个限制:

好的设计没有硬性的 64 连接限制。基本上,如果您使用某种线程模型,您将不会遇到此限制。

以下是有关您听说的限制的一些信息:

4.9 - “64 个套接字”的限制是什么?

有两个 64 插槽限制:

Win32 事件机制(例如WaitForMultipleObjects())一次只能等待64 个事件对象。Winsock 2 提供了 WSAEventSelect() 函数,它允许您使用 Win32 的事件机制来等待套接字上的事件。因为它使用 Win32 的事件机制,所以一次只能等待 64 个套接字上的事件。如果要一次等待超过 64 个 Winsock 事件对象,则需要使用多个线程,每个线程等待不超过 64 个套接字。

select() 函数在某些情况下也被限制为一次等待 64 个套接字。winsock.h 中定义的 FD_SETSIZE 常量决定了传递给 select() 的 fd_set 结构的大小。它默认定义为 64。您可以在 #include winsock.h 之前将此常量定义为更高的值,这将覆盖默认值。不幸的是,至少有一个非 Microsoft Winsock 堆栈和一些分层服务提供程序假定默认值为 64;他们将忽略较大 fd_sets 中第 64 个以上的套接字。

您可以编写一个测试程序来在您计划支持的系统上进行尝试,看看它们是否不受限制。如果是这样,您可以使用线程来解决这个问题,就像使用事件对象一样。

来源

于 2009-01-04T17:17:14.623 回答
2

@布莱恩:

                if ((gConnections.size() + 1) > 64) {
                    // For the background on this check, see
                    // www.tangentsoft.net/wskfaq/advanced.html#64sockets
                    // The +1 is to account for the listener socket.
                    cout << "WARNING: More than 63 client "
                            "connections accepted.  This will not "
                            "work reliably on some Winsock "
                            "stacks!" << endl;
                }

对 OP:

为什么你不想使用winsock2?您可以尝试使用 IOCP 构建您自己的服务器,尽管制作这个跨平台有点棘手。您可以像 Brian 建议的那样查看 Boost::asio。

于 2009-01-04T17:25:16.727 回答
1

在您决定需要“winsock2 的替代方案”之前,请阅读以下内容:Microsoft Windows 的网络编程

总之,您不需要“Winsock2 的替代品”,您需要了解如何使用所提供的编程模型在您的目标平台上完全发挥作用。然后,如果你真的需要使用异步 I/O 的跨平台套接字代码,那么看看 ASIO,但是,如果你真的不需要跨平台代码,那么考虑一些真正关注你在平台上可能遇到的问题的东西您确实需要专注于 - 即特定于 Windows 的东西。回到上面提到的书,看看你有各种选择。

最具性能和可扩展性的选项是使用 IO 完成端口。我有一些免费的代码可以从这里获得,可以很容易地编写一个在基于 Windows (NT) 的平台上扩展和执行良好的服务器;链接页面还链接到我写过的一些文章。我的框架与 ASIO 的比较可以在这里找到:http: //www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html

于 2009-01-04T22:54:48.373 回答