1

我有用 C# 编写的 TCP 服务器和客户端。由于我的连接是通过不可靠的 wifi 进行的,因此我使用重新发送相同的数据包并处理数据包丢失。

例如银行账户平台。用户存款,客户端发送此消息给服务器,如果服务器收到此消息,则回复客户端操作成功。如果客户端没有收到回复,它会在一段时间后再次发送。

这看起来很简单,但是当 wifi 卡住并且客户端没有收到回复并继续向服务器发送相同的消息时,我遇到了这种情况。最终这些消息同时被服务器接收。结果,服务器认为用户存了 100 次钱。

我想知道人们通常如何处理 tcp 服务器客户端程序的这种情况,特别是当应用程序不仅仅是聊天应用程序,而是更敏感的信息(如金钱)时。我的第一个想法是在消息中添加一个事务 ID,这样服务器就不会处理具有相同事务 ID 的消息,这将防止上述情况。但不确定是否有更好的解决方案或.Net 对此有一些内部功能。

谢谢你。

4

1 回答 1

0

当您使用 C# 编码时,您主要是在OSI 模型的应用程序层中工作。TCP协议工作在传输层(低于应用层)。

您想要实现的可靠性已经嵌入 TCP 协议本身。这意味着,如果某些数据包丢失,它将自动尝试重新发送数据包,而无需您的额外请求。这也将在控制权返回给应用层程序之前发生。还有其他保证,例如数据包的有序交付。

这意味着,您需要的功能已经在下面的层实现,您无需担心。

请注意,如果您要使用UDP,您需要自己处理可靠性问题。

于 2013-10-10T13:43:22.447 回答