寻找一个最简单(且速度最快)的TCP套接字编程示例,适用于Windows、C或C++。

4
我正在寻找一个最简单(也是最快)的TCP套接字编程示例,用于Windows平台,使用C或C++语言均可,能够快速实现发送微不足道的数据,例如1个字节或几个字节,但要在一个数据包中发送。这是为了研究目的。我通过谷歌搜索找到了几个示例,但每个示例看起来都有些不同,有些是用C编写的,有些是用C++编写的,有些使用Windows的ZeroMemory函数,有些使用memset函数,有些以不同的方式分配数据,因此虽然我可以找到C/C++中Winsock的示例,但由于我不是套接字编程专家,我不确定在最快的方式下实现它所需的绝对最小化的C/C++代码是什么。
我知道UDP会更快,但同时需要保证可靠性,因此我正在寻找TCP。
我想我可以尝试每个示例并尝试计时,但我想知道这里是否有一位套接字/Winsock专家能提供一个超级简单的C/C++服务器/客户端,并附带一些计时函数(高分辨率)。我说超级简单,因为我正在尝试确定套接字在我的机器上传输的速度(以及最快的方式),当然,它可以包括关闭Nagle算法,这正是我想要做的。我不确定其他人使用什么技巧。
谢谢。

你做了哪些研究?指出你打算使用的代码并得出结论会很有益……你在谷歌上找到的每一个样本,肯定有一个使用了zeromemory,另一个使用了memset,在一天结束时,你看到的代码基本上都使用了sockets…… - t0mm13b
只是一点小建议:使用TCP来分发小数据包会过于浪费。尽可能地缓冲它们,否则你将会在处理数据包头部时浪费很多时间。 - Jack
@tommieb75 - 目前还没有太多的研究,正如一开始所述,它们都使用套接字,但差异可能是微秒级别,这对我来说很重要。无论如何,感谢您的评论。 - ra170
还有RUDP,它可靠且快速,因为它省略了连接设置: http://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol - Peter G.
请参考以下内容:https://dev59.com/knVD5IYBdhLWcg3wDHDm - Peter G.
8个回答

2
尝试使用Len Holgate的套接字服务器框架。我相信他已经将其商业化为打包版本,但这应该是一个很好的起点。其中包括客户端实现教程。这不是最简单的代码,但如果您想要最大化性能,简单的代码可能不符合您的需求。
您将需要添加自己的时间支持,但对于任何可能的现成软件包来说,这都是真实的。

谢谢,我会去看看。我所说的最简单和最快就是这个意思,可能需要添加/调整以提高性能。 - ra170
Steve,谢谢你的链接,也许更好的起点是这个链接:http://www.serverframework.com/products---the-free-framework.html 这里有最新的免费代码以及商业版本的详细信息。 - Len Holgate
@Len - 您好,感谢您的帮助。在实现IOCP服务器/客户端代码时,您的在线帖子对我非常有帮助。 - Steve Townsend

1

Boost Asio 可能是你最好的选择。它是一个非常好的库,具有定时支持和你需要启动的所有功能。

编辑:我知道这不是一个预构建的客户端/服务器,这正是你要找的,但是 Asio 使得只需几行代码就可以轻松实现你想要的功能。


“极其容易”?不……它有很多内部管道。就我个人而言,我花了至少一个月的时间才开始使用它——感觉像是盲目的。如果你正在寻找一个非常简单的例子,我建议你阅读一些发送UDP数据包的C语言示例等。 - yO_

1

谢谢,我也找到了那个,但不确定它是否真的是最简单的。再次感谢。 - ra170

1

如果您想要一个现成的产品,可以查看任何可用的消息传递产品。它们需要最少的编码才能开始运行,典型的例子包括:

开源:

  1. OpenDDS - 基于DDS协议(非常高性能-用于潜艇、船舶控制系统等)。他们的实现比原始的boost::asio稍慢,但是对于易用性和附加功能来说,很难被超越。
  2. ZeroMQ - 类似于DDS,但基于MQ协议,同样非常快(每秒数百万条消息),MQ已经建立,但ZeroMQ还没有。
  3. AMQP - 我相信您可以在Red Hat这个领域找到一些东西,同样非常快速,是一种新的协议。

商业:

  1. Tibco RV:除了硬件供应商外,很难被超越
  2. 29West - 硬件(和软件-虽然我从未亲自使用过)
  3. Solace - 硬件
  4. Tervella - 硬件

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


0

0

我刚刚使用socket++实现了一个网络解决方案,它运行得非常好。我相信这是boost asio的基础,所以如果你不想安装所有的boost,可以试试这个。

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

编辑:如果你正在使用更高版本的Windows,则需要对该库进行一些调整才能编译(它在XP上运行良好,但显然一些网络代码已经移动到win vista和7中)。


是的,我使用Windows 7和Windows Server 2003,但谢谢。我会在今天或不久之后检查它。 - ra170
啊,好的。更改涉及删除大部分类Unix代码(如forking),链接到ws2_32.lib,摆脱所有测试,并确保WSAE标识符正常工作。所以在win7上让它运行起来可能不是那么简单,但一旦完成,就可以这样使用:“myStream <<“这里是要发送到网络的字符串!<< std::endl; mystream.flush()”。 - mmr

0

0

ucspi-tcp

虽然年代久远但仍不失优秀,用C语言编写的ucspi-tcp是广泛使用的邮件服务器qmail的基础。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接