一台服务器多客户端 C/C++
One Server Multiple Client C/C++
我知道有很多关于这个问题的主题,但我需要关于我的情况的更详细的建议。
我的架构由多个I/O外围设备(客户端(和一个中央单元(服务器(组成,通过以太网连接到没有互联网连接的LAN中。
客户端必须将数据(字节(发送到我的服务器,每个外围设备必须发送的字节量约为 20 字节。此外,我的系统应该在几分钟、几小时或几天内不间断地工作,没关系。数据将每秒(或多或少(通过连接发送一次。
所以,问题是:我应该使用TCP还是UDP?在这种情况下,哪一个更好?
我在互联网上的一些指南上读到,可以使用"select(("或"fork(("。我有一些关于多用户聊天中使用的多客户端和单服务器通信的基本程序。我的应用程序应该做什么和多用户聊天之间的区别在于,我应该将数据保存在服务器计算机上的文件中。
我有一个类似的应用程序,我使用 UDP 确认,它是一个服务器,它参加了数百个外围设备、时钟。我所说的承认是什么意思;每个客户端都会向服务器发送一个数据包并等待确认数据包 (ACK(。如果客户端没有收到 ACK(在 2-4 秒内(,它会再次发送相同的数据。
为什么选择UDP:因为它比TCP更容易编程。在服务器端,您只需要一个绑定到端口并侦听传入数据包的开放套接字。收到数据包后,服务器会向发送 IP 发送 ACK 数据包。客户端还应绑定到 UDP 端口以接收 ACK 数据包。这些端口号可能相同,也可能不同。例如,服务器端口可以是 6050,客户端端口可以是 6060,这取决于您。
另一方面,如果使用TCP,则需要每个连接的客户端一个套接字,并使用select
或poll
来查看哪个客户端有挂起的数据。但在这种情况下,您不需要 ACK,因为 TCP 是可靠且面向连接的。
使用 UDP 可能会遇到两个问题:
-
The client’s packet is lost
:这是最简单的一个,客户端永远不会收到ACK数据包,它将再次发送相同的数据包。 -
The server ACK packet is lost
:在这种情况下,客户端将再次发送相同的数据包,服务器已经得到的数据包,如果数据包重复是一个问题,那么您可以考虑对数据包进行编号,我的意思是,在客户端发送的数据中有一个字段整数表示数据包编号。使用此信息,服务器可以丢弃重复:IP/数据包编号。
真正的问题应该是:您是否需要可靠的消息传递?如果是,那么您应该使用 TCP。
TCP 的开销经常被夸大。正如Jeremy在下面的评论中提到的,在"正常"情况下,您可以避免大部分开销。当数据包丢失等坏事发生时,您将不得不支付TCP和UDP的开销,那么为什么不免费获得可靠协议的工作版本呢?从长远来看,这将更简单。ja_mesa描述的连接状态跟踪再次正是TCP已经为您所做的。它称为序列号。帮自己一个忙,不要重新安装轮子。把时间花在重要的地方编码。
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 从服务器传输到客户端的消息不会出现
- OpenSSL TLS服务器-使用客户端证书白名单
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何绑定 C++ gRPC 客户端的网络接口
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 将相机数据从服务器实时流式传输到客户端
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- GRPC C++ TLS 客户端 grpc::SslCredentials() 方法不返回
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 如何暂停插孔音频客户端
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io