如何使用套接字构建健壮的网络架构

时间:2016-04-28 13:29:44

标签: c++ sockets http networking server

我必须从一台服务器到多台PC(~1000台PC)建立连接。这些PC通过同一建筑物中的Wifi网络连接。

每台PC都与服务器有专用连接。形成其IP地址,服务器知道要生成的特定数据。

我必须通过网络向每台PC发送一个专用的短字符串。 (约30个字符的字符串)

专用字符串以30个字符串的频率发送到每台PC。

问题是这些发送的数据很关键,应该实时发送。

在我的情况下哪种解决方案更快更强大?

4 个答案:

答案 0 :(得分:4)

我假设您有两台通过以太网或wifi连接的PC,或者足够好的现代互联网连接(地球上都没有;没有行星际......;没有来自20世纪70年代的鸽子IP RFC1149或1200波特模拟调制解调器) 。 那么每秒约30个字符的30个字符串大约每秒一千字节,一个大问题,当然 高频率,如你所声称的那样。 我目前在家里(法国巴黎附近)的光纤互联网连接每秒下载十几兆字节,每秒上传至少一兆字节。几年前,ADSL每秒下载大约1兆字节。我从来没有家里有互联网连接,每秒一千字节是高负荷。 (如果你在行星际空间,或者在非洲或南极洲最偏远和荒凉的地方,那么2016年可能会出现1K字节/秒的问题,但是你对互联网连接非常不吉利)。

您的HTTP设置可能会使用websockets(所以有点像您的第二个解决方案)。您可以在服务器端使用libonion(HTTP服务器库),在客户端使用libcurl(HTTP客户端库)。定期轮询(例如,每秒发出20次HTTP请求)将需要更多资源(但这仍然是可管理的)。 HTTP连接会更慢,因为HTTP会增加一些开销(HTTP请求和响应中的标头)。

请注意,HTTP协议高于TCP / IP,因此在提供它们的操作系统(Linux,Windows,MacOSX,...)上肯定会使用BSD sockets。所以"网络解决方案" 已经使用套接字了。

如果使用套接字,则需要在它们上定义协议(或使用某些现有协议,如HTTP或JSONRPC)。

我会采用套接字方法。可能是一些JSON相关的东西,比如JSONRPC。请注意,如果您在套接字API上进行编码,则该TCP / IP是没有消息边界的流协议。您需要在两端缓冲,并定义一些消息边界约定。您可以发送JSON,以换行符结束(结尾换行符与JSON兼容,并便于分隔邮件)。

您可能对0mq等消息库感兴趣。

附录(问题编辑后)

你的新问题大不相同(成千上万台PC,不仅仅是其中两台;我猜它们位于同一栋楼,或者至少是同一块大陆。)。您需要大约1000 * 30 * 30,即每秒带宽小于1兆字节。 我仍然建议使用一些套接字。可能0mq更具相关性。您可能会使每条消息都成为JSON。您需要很好地记录您正在使用的协议。可能,您希望服务器具有多个线程(例如十几个,而不是数千个线程)来循环发送消息(在TCP上)。也许您可能希望服务器具有多个以太网连接(但每秒兆字节可以在一个以太网上,甚至 100Mbits /秒)。

答案 1 :(得分:2)

30字节,每秒30次,每秒900字节。那根本不快;任何一种方法都可以。请注意,HTTP连接无论如何都使用套接字。

这听起来像是你的" socket"选项意味着保持套接字连接打开 all 时间,而不是HTTP,其中(通常)为每个请求打开一个单独的连接。我认为你真正要问的是:

  • 让客户定期询问服务器是否有新数据,或
  • 让服务器在新数据可用后立即发送。

这完全取决于您的计划要求,我们不知道。

答案 2 :(得分:1)

千位双向TCP通信需要1000个套接字(除非您想为每个发送的字符串打开和关闭连接,但这将是主要的性能消耗)。

危险地接近最大打开文件描述符(1024)的惯用软限制。它是4096的惯用硬限制的25%。鉴于此,我发现TCP不适合这里。

相反,我建议使用UDP。使用UDP,你只需要少量的套接字(即使有一个套接字,但有多个套接字你可以更好地扩展)。它会有可靠性问题,但您可以在UDP之上实现某种类型。

答案 3 :(得分:0)

请熟悉OSI model。 套接字(UDP,TCP)位于第4层,HTTP位于第5层,因此已使用第4层协议。