在读取端收到关闭后需要帮助写入套接字

Posted

技术标签:

【中文标题】在读取端收到关闭后需要帮助写入套接字【英文标题】:Need help writing to a socket after receiving a shutdown on the read side 【发布时间】:2013-09-08 15:37:21 【问题描述】:

我正在尝试在 C# 中实现 HTTP 代理,作为我正在开发的整体业务应用程序的一部分,但遇到了以下难题。

HTTP 标准的一部分规定浏览器可以发出一个套接字关闭 (SocketShutdown.Send),此时服务器会将所有剩余的数据传递给浏览器并关闭它自己的一半套接字。当浏览器半关闭其连接时,我在套接字的接收端得到预期的行为,即 Select() 指示套接字是可读的,但使用 Receive() 从套接字读取返回零字节。但是当我尝试使用 Send() 写入我的套接字时,我得到一个 SocketException,指示 WSAECONNRESET。就好像浏览器的 Shutdown() 导致整个 TCP 连接被拆除,而不仅仅是入站支路。

有没有人有在 C# 中使用半封闭套接字的经验,特别是写入被同行半封闭的套接字?

暂时没有示例代码,但如果没有人可以回复,我会提供一些。

【问题讨论】:

【参考方案1】:

您无法判断传入的 FIN 是由关机还是关闭引起的。在这种情况下,它显然是由关闭引起的。当您在入站套接字 A 上获得 FIN 时,正确的技术是关闭相应的出站套接字 B 以进行写入,然后当您在 that 套接字上作为入站套接字 (B) 获得 FIN 时,关闭相应的用于写入的出站套接字 A。关闭两个套接字后,将它们都关闭。

【讨论】:

事实证明我的闭包逻辑是正确的(正如您所描述的那样),但令人尴尬的是,我在将块返回给浏览器之前对其进行了处理(不转发块标头),因此浏览器感到困惑并关闭连接。

以上是关于在读取端收到关闭后需要帮助写入套接字的主要内容,如果未能解决你的问题,请参考以下文章

Java 套接字服务器只显示连接关闭后收到的消息

InputStream 没有收到 EOF

QT学习笔记(13) QT下的UDP通信

提升asio断网处理

关闭后从套接字读取数据

AsynchronousSocketChannel 一次写入/读取所有消息