gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:39:07 24 4
gpt4 key购买 nike

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

我的架构由多个 I/O 外围设备 (CLIENT) 和一个中央单元 (SERVER) 组成,通过 LAN 中的以太网连接,无需互联网连接。

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

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

我在互联网上阅读了一些指南,可以使用“select()”或“fork()”。我有一些关于多用户聊天中使用的多客户端和单服务器通信的基本程序。我的应用程序应该执行的操作与多用户聊天之间的区别在于我应该将数据保存在服务器计算机上的文件中。

最佳答案

我有一个类似的应用程序,我使用带有确认的UDP,它是一个包含数百个外围设备、时钟的服务器。我所说的承认是什么意思;每个客户端都会向服务器发送一个数据包并等待确认数据包 (ACK)。如果客户端没有收到 ACK(2-4 秒内),它将再次发送相同的数据。

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

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

使用 UDP 可能会遇到两个问题:

  1. 客户端的数据包丢失:这是最简单的一种,客户端永远不会收到 ACK 数据包,它会再次发送相同的数据包。
  2. 服务器 ACK 数据包丢失:在这种情况下,客户端将再次发送服务器已经收到的相同数据包,如果数据包重复是一个问题,那么您可以考虑对数据包进行编号,我的意思是,在客户端发送的数据中,有一个表示数据包编号的字段整数。有了这些信息,服务器就可以丢弃重复的内容:IP/数据包号。

关于c++ - 一台服务器多客户端 C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com