【问题标题】:Looking for a simplest (and fastest) example of TCP socket programming for windows, c or c++寻找 Windows、c 或 c++ 的 TCP 套接字编程的最简单(和最快)示例
【发布时间】:2017-11-10 13:51:39
【问题描述】:

我正在寻找一个用于 windows、c 或 c++ 的 TCP 套接字编程的最简单(和最快)示例,无论哪个可以更快地完成它,发送琐碎的数据,例如 1 个字节或几个字节,但在一个数据包中.这是出于研究目的。我在谷歌上搜索并找到了几个示例,但是每个示例看起来都有些不同,有些是 C 语言,有些是 C++,有些使用 ZeroMemory(来自 Windows),有些使用 memset,其中一些以不同的方式分配数据,所以虽然我可以在 c/c++ 中找到 winsock 的示例,而且我不是套接字编程方面的专家 - 我不确定什么是绝对简约的 c/c++ 代码才能以最快的方式完成它。

我知道 UDP 会快得多,但它需要同时可靠,因此我正在寻找 TCP。

我想我可以尝试它们中的每一个并尝试为它们计时,但想知道这里的某些套接字/winsock 专家是否会有一个超级简单的 C/C++ 服务器/客户端,最后带有一些计时功能(高分辨率) . 我说超级简单,因为我试图确定在我的机器上套接字传输的速度(和最快的方式),当然它可以包括关闭 Nagle 的算法,这是我无论如何都想做的。我不确定人们还使用了哪些其他技巧。

谢谢。

【问题讨论】:

  • 您具体做了哪些研究?指出您打算使用的代码并返回您的结论将是有益的......您在谷歌中找到的每一个样本,确定一个使用 zeromemory,另一个使用 memset,最后当天,您看到的代码基本上使用套接字....
  • 附注:使用 TCP 发送小数据包将是多余的。尽量缓冲它们,否则你会浪费很多时间来处理数据包头..
  • @tommieb75 - 到目前为止,没有太多的研究,正如开头所说,是的,它们都使用套接字,但差异可能是微秒,这对我来说很多。无论如何,谢谢你的评论。
  • 还有可靠且快速的 RUDP,因为它省略了连接设置:en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol

标签: c++ windows performance sockets winsock


【解决方案1】:

试试 Len Holgate 的 socket server framework。我相信他已经在打包版本中将其商业化,但这应该是一个很好的起点。包括一个客户端实现教程。这不是最简单的代码,但如果您对最大化性能感兴趣,那么简单的代码可能无法满足您的需求。

您必须添加自己的计时支持,但这可能适用于任何可能的现成包。

【讨论】:

  • 谢谢,我去看看。我所说的最简单和最快的意思就是,可能需要添加/调整它以提高性能。
  • Steve,感谢您提供的链接,这个链接可能是一个更好的起点:serverframework.com/products---the-free-framework.html,其中包含最新的免费代码以及商业版本的完整详细信息。
  • @Len - 不客气 - 在实现 IOCP 服务器/客户端代码时,您的在线帖子对我很有帮助
【解决方案2】:

Boost Asio 可能是您最好的选择。这是一个非常好的库,具有时间支持和一切你需要的东西。

编辑:我知道这不是您正在寻找的预先构建的客户端/服务器,但是 Asio 可以非常轻松地从几行代码中获得您想要的东西。

【讨论】:

  • “非常简单”?不...它有很多内部管道。我个人至少花了一个月才使用它 - 有一种失明的感觉。如果您搜索一个非常简单的示例,我建议您阅读一些用于发送 UDP 数据包等的 C 示例。
【解决方案3】:

我所知道的最简单的例子是Beej's Guide

【讨论】:

  • 谢谢,我也找到了那个,但不确定这是否是最简单的。再次感谢。
【解决方案4】:

如果您想要现成的产品,请查看任何可用的消息传递产品。他们需要最少的编码才能开始,典型的例子是:

开源:

  1. OpenDDS - 基于 DDS 协议(非常高性能 - 用于潜艇、船舶控制系统等)。它们的实现比原始 boost::asio 稍慢,但是为了易于使用和花里胡哨,难以击败。
  2. ZeroMQ - 类似于 DDS,但基于 MQ 协议,同样非常快(百万条消息/秒),MQ 已建立,但 ZeroMQ 尚未建立。
  3. AMQP - 我相信您将能够在这个领域从 Red Hat 找到一些东西,而且速度非常快,而且是一种新协议。

商业:

  1. Tibco RV:除了硬件供应商之外,很难被击败
  2. 29West - 硬件(和软件 - 以为我从未亲自玩过它)
  3. 安慰 - 硬件
  4. Tervella - 硬件

最后三个假设您有几百万美元! ;)

【讨论】:

    【解决方案5】:

    在写第三条评论之前,我把它们收集在一个答案中

    【讨论】:

      【解决方案6】:

      我刚刚使用socket++ 实现了一个网络解决方案,效果很好。我相信它是 boost asio 的基础,所以如果你不想安装所有的 boost,你可以去看看。

      这个库的重点是你可以在你的套接字上使用一个流,像你想要的那样发送数据到 std::cout 或 std::cerr。

      编辑:如果您使用的是更新版本的 windows,那么这个库需要一些调整才能编译(它在 XP 上工作正常,但显然一些网络代码在 win vista 和 7 上移动了)。

      【讨论】:

      • 是的,我使用的是 windows 7 和 windows server 2003,但谢谢。我今天会检查一下,很快的某个时间。
      • 啊,好的。更改包括删除大部分 unix-y 代码(如分叉)、链接到 ws2_32.lib、摆脱所有测试以及确保 WSAE 标识符正常工作。所以在win7下工作可能不是那么简单,但是一旦它在那里,它就是“myStream
      【解决方案7】:

      您可以查看Push Framework

      【讨论】:

        【解决方案8】:

        ucspi-tcp

        Oldie but goodie,用C写的,qmail被广泛使用的邮件服务器就是基于它的。

        https://cr.yp.to/ucspi-tcp.html

        【讨论】:

          猜你喜欢
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-09
          • 2014-05-18
          • 2018-05-19
          • 2013-09-29
          • 2011-06-22
          相关资源
          最近更新 更多