winsock2 的替代品,带有 C++ 中的示例服务器源

Posted

技术标签:

【中文标题】winsock2 的替代品,带有 C++ 中的示例服务器源【英文标题】:alternatives to winsock2 with example server source in c++ 【发布时间】:2009-01-04 17:15:11 【问题描述】:

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

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

这 64 个连接是真的吗?

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

谢谢

【问题讨论】:

【参考方案1】:

替代库:

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

您可以找到example source code you seek here。


关于 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。

你可以写个测试程序试试 这在您计划的系统上 支持,看看他们是不是 有限的。如果是的话,你可以得到 用线程解决这个问题,就像你一样 将与事件对象。

Source

【讨论】:

【参考方案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。

【讨论】:

这段代码来自哪里?什么时候选择超过 64 个连接?您应该改用线程模型,这样您就不必这样做了。 此代码来自:tangentsoft.net/wskfaq/examples/basics/select-server.cpp 可以在 OP 链接的页面上找到。【参考方案3】:

在您决定需要“winsock2 的替代品”之前,请阅读以下内容:Network Programming for Microsoft Windows。

总而言之,您不需要“Winsock2 的替代品”,您需要了解如何使用提供的编程模型以在您的目标平台上充分发挥作用。然后,如果您真的需要使用异步 I/O 的跨平台套接字代码,请查看 ASIO,但是,如果您不真的需要 跨平台代码然后考虑实际关注您可能需要关注的平台上的问题的内容 - 即特定于 Windows 的内容。回到上面提到的书,看看你有各种选择。

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

【讨论】:

以上是关于winsock2 的替代品,带有 C++ 中的示例服务器源的主要内容,如果未能解决你的问题,请参考以下文章

WinSock2.h 中的重新定义错误 [重复]

WebSocket客户端和WinSock2服务器,可以吗?

C++ WinSock2:连接()调用上的 WSA_INVALID_HANDLE

VC++ Winsock2 错误 10049。尝试构建 IRC 机器人

我用winsock2在C++中做了一个简单的套接字,我把recv函数放入一个变量中,它给出了一些奇怪的符号

CoreData - 相当于使用带有示例的类别 - Swift