一台服务器多客户端C / C ++

时间:2014-12-12 10:20:50

标签: c++ c sockets tcp udp

我知道有很多关于这个问题的主题,但我需要一个关于我的情况的更详细的建议。

我的架构由多个I / O外设(CLIENT)和一个中央单元(SERVER)组成,在没有互联网连接的情况下通过以太网连接到LAN。

客户端必须向我的服务器发送数据(字节),每个外设必须发送的字节数大约为20个字节。 此外,我的系统应该工作而不会被打乱几分钟,几小时或几天,这并不重要。 数据将每秒(或多或少)通过连接发送。

所以,问题是:我应该使用TCP还是UDP?在这种情况下哪一个更好?

我在互联网上阅读了一些指南,可以使用" select()"或" fork()"。 我有一些关于多用户聊天中使用的多客户端和单服务器通信的基本程序。 我的应用程序应该做什么和多用户聊天之间的差异是我应该将数据保存在我的服务器计算机上的文件中。

2 个答案:

答案 0 :(得分:0)

真正的问题应该是:你需要可靠的信息传递吗?如果是,那么你应该使用TCP。

TCP的开销经常被夸大。正如杰里米在下面的评论中提到的,你可以避免“正常”案件中的大量开销。当丢包等不良事件发生时,您将不得不支付TCP和UDP的开销,那么为什么不免费获得可靠协议的工作版本呢? 从长远来看,这将更简单。 ja_mesa描述的连接状态跟踪正是TCP已经为您做的。它被称为序列号。帮自己一个忙,不要重新实现轮子。花时间编码重要的地方。

答案 1 :(得分:0)

我有一个类似的应用程序,我使用带有确认的UDP,它是一个服务器,它可以访问数百个外设,即时钟。我的意思是承认;每个客户端向服务器发送一个数据包并等待一个确认数据包(ACK)。如果客户端没有收到ACK(在2-4秒内),它会再次发送相同的数据。

为什么选择UDP:因为它比TCP更容易编程。在服务器端,您只需要一个打开的套接字,该套接字绑定到端口并侦听传入的数据包。一旦收到数据包,服务器就会向发送IP发送ACK数据包。客户端还应绑定到UDP端口以接收ACK数据包。这些端口号可以相同或可以不同。服务器端口可能是6050,客户端端口可能是6060,例如,它取决于您。

另一方面,如果您使用TCP,则每个连接的客户端都需要一个套接字,并使用selectpoll查看哪个具有待处理数据。但在这种情况下,您不需要ACK,因为TCP可靠且面向连接。

UDP可能面临两个问题:

  1. The client’s packet is lost:这是最简单的一个,客户端永远不会收到ACK数据包,它会再次发送相同的数据包。
  2. The server ACK packet is lost:在这种情况下,客户端将再次发送相同的数据包,一个服务器已经获得,如果数据包重复是一个问题,那么你可以考虑编号数据包,我的意思是,在客户端的数据中发送有一个字段整数,表示数据包编号。使用此信息,服务器可以丢弃重复:IP /数据包号。