我有用C#编写的TCP服务器和客户端。由于我的连接是通过wifi不可靠的,我使用重新发送相同的数据包并处理数据包丢失。
例如银行帐户平台。用户存钱,客户端将此消息发送给服务器,如果服务器收到此消息,则回复客户端操作成功。如果客户端没有收到回复,它将在一段时间后再次发送。
这看起来很简单,但我遇到了一个情况,当wifi卡住并且客户端没有收到回复并继续向服务器发送相同的消息。最终服务器同时收到这些消息。结果服务器认为用户存钱100次。
我想知道人们如何处理tcp服务器客户端程序的这种情况,特别是当应用程序不仅仅是一个聊天应用程序,而是更加敏感的信息,如钱。我的第一个想法是在消息中添加一个事务ID,这样服务器就不会处理具有相同事务ID的消息,这将阻止上述情况。但不确定是否有更好的解决方案或.Net有一些内部功能。
谢谢。
答案 0 :(得分:0)
当您使用C#编码时,您主要在Application layer的OSI model内工作。 TCP协议适用于Transport layer(位于应用层之下)。
您希望实现的可靠性已嵌入TCP协议本身。这意味着,如果有些数据包丢失,它会在没有您的额外请求的情况下自动重新发送数据包。在将控件返回到应用程序层程序之前,也会发生。还有other guarantees,例如有序传送数据包。
这意味着,您需要的功能已在下面的图层中实现,您无需担心。
注意,如果您使用UDP,则需要自己处理可靠性问题。