题
我正在使用 http:// tangentsoft中的此示例实现。净/ wskfaq /示例/基础/选择-server.html
这正在完成我需要的大部分工作,处理连接而不会阻塞,并且所有工作都在其线程中(不像某些示例那样为每个连接创建新线程),但我担心因为我被告知winsock只支持max 64客户端连接:S
这64个连接是真的吗?
我还有其他选择吗?对于类似的实现,有一个c ++示例会很酷。
由于
解决方案
替代图书馆:
您应该考虑使用 boost asio 。它是一个跨平台的网络库,简化了您可能需要完成的许多任务。
您可以找到您寻求的示例源代码这里。
关于64限制:
没有严格的64连接限制,您将体验到良好的设计。基本上,如果您使用某种线程模型,您将不会遇到此限制。
以下是您听到的限制的一些信息:
4.9 - 什么是“64个插座”?限制?
有两个64插槽限制:
Win32事件机制(例如 WaitForMultipleObjects())只能 一次等待64个事件对象。 Winsock 2提供了 WSAEventSelect()函数让我们 你使用Win32的事件机制 等待套接字上的事件。因为它 使用Win32的事件机制,你可以 只等待64个套接字上的事件 一时间如果你想等待更多 一个以上的64个Winsock事件对象 时间,你需要使用多个 线程,每个等待不超过 64个插座。
select()函数也是有限的 在某些情况下等待64 一次插座。 FD_SETSIZE 在winsock.h中定义的常量 确定fd_set的大小 传递给select()的结构。它的 默认定义为64.你可以 将此常量定义为更高的值 在#include winsock.h之前,和 这将覆盖默认值。 不幸的是,至少有一个 非Microsoft Winsock堆栈和一些 分层服务提供商承担 默认值为64;他们会忽略 超过64号的插座更大 的fd_sets。
你可以写一个测试程序来试试 在您计划的系统上 支持,看看他们是不是 有限。如果他们是,你可以得到 围绕这个与线程,就像你一样 将与事件对象。
其他提示
@布赖恩:
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。
在您决定需要'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 。