2016-11-25 103 views
0

假设我使用System.Net.Sockets.TcpClient连接到某人。我发送消息给他们,然后我立即调用TcpClient.Close();另一个客户是否保证收到消息?另外,在大多数TCP实现中,这是真/假吗?TCP - 发送消息,然后断开

+1

总之 - 不,不能保证(除了一些特定的条件/用法) – Vlad

+0

出于好奇,为什么TCP上UDP,如果你正在寻找一个火灾和遗忘类型的消息? – ColinM

+0

@ColinM - 我正在制作一个聊天应用程序,并试图找到“踢”某人的最佳方式。我希望服务器可以发送一条消息,说明该人已被X踢了Y原因,然后立即关闭连接并断开连接。 –

回答

1

Vlad的评论是正确的 - 交付不能保证。

假设建立了与对等方的TCP连接。发送操作只是将数据复制到操作系统中的网络堆栈,并且发送它是OS的责任。你称操作关闭。操作系统不会停止发送以前的数据。 OS将套接字关闭直到数据被发送。从应用的角度来看它是透明的。

但是可能会发生错误。对方可能会崩溃,网络可能会中断或者其他任何事情。尽管如果TCP ACK未收到,操作系统会尝试重新传输数据,但重新发送可能会一次又一次地失败,直到操作系统放弃。这种通用机制在所有实现TCP协议的操作系统中都是相同的。

如果您需要有保证的交付,那么您必须实施应用程序级别机制来确认收到的数据。