问题标签 [half-close]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3051 浏览

sockets - 套接字:不断让 POLLHUP 处于半关闭状态

我写了一个套接字服务器,在 linux 上运行,但这可能不是 linux 规范。

poll()用来检查客户的状态。我的客户在发送请求后会主动(半)关闭。由于客户端的半关闭,服务器不断获取POLLHUP和。POLLERR我也看到POLLRDHUP了,所以我知道这实际上是半关闭而不是连接关闭/重置。我的问题是我总是会收到这些事件,即使我已经从之前的民意调查中知道有一半接近。

我怎样才能禁用它,这样我就不再收到 thisis 事件了?我试图做额外的事情read()并做一个shutdown(fd, SHUT_RD),但它似乎没有帮助。我不想poll因为我已经处理过的事件而醒来。

0 投票
1 回答
1251 浏览

networking - 关于tcp半关闭的问题

请看下面的图片:

在此处输入图像描述

客户端发起半关闭请求并得到确认,如果我没有误解半关闭的含义,客户端应该无法发送任何数据,那么它以后如何发送回ACK

0 投票
1 回答
1049 浏览

http - HTTP/1.1 是否允许通过半关闭连接来分隔请求结束?

RFC2616 第 4.4 部分指定如何在 HTTP/1.1 中确定消息的结尾。该部分中的第 5 项指定服务器可以关闭连接以指示响应已完成。

它还继续说,像这样划分请求是不可能的。但是,TCP 允许客户端关闭其端并继续接收响应。我什至测试过它;有用。

问题:

  • 为什么 1999 年的标准说这实际上是不可能的?那时 TCP 已经很好地建立起来,并且到那时已经支持了很长一段时间的半关闭(可能从 1974 年就一直支持?)。

  • 客户端半关闭连接以指示请求结束是否违反协议?

请忽略这是否是一个好主意:我知道您有时无法完全判断连接是故意关闭还是刚刚断开,以及保持连接打开以供以后重用如何更有意义。

0 投票
1 回答
863 浏览

tcp - TCP 端点如何知道另一个端点是关闭了连接的两半还是只关闭了一个?

考虑在两个 TCP 端点之间建立的 TCP 连接,其中一个端点调用:

  1. close(): 在这里,不允许进一步读取或写入。

  2. shutdown(fd, SHUT_WR):这会将全双工连接转换为单工连接,端点调用SHUT_WR仍然可以读取。

但是,在这两种情况下,FIN 数据包都会通过线路发送到对等端点。那么问题来了,接收到 FIN 的 TCP 端点如何区分另一个端点是否使用了close()or SHUT_WR,因为在后一种情况下它应该仍然能够发送数据?

0 投票
1 回答
80 浏览

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

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

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

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

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

0 投票
1 回答
85 浏览

python - 无限循环我不知道为什么(二分法搜索)

所以我正在开发一个通过二分法搜索术语的程序。它产生了一个无限循环,我不知道为什么,但我知道在哪里(在 elif/else 中)。所以这是我的代码:

我知道有很多方法可以更轻松地做到这一点,但我需要保持列表不变。已经谢谢你们了!

0 投票
0 回答
65 浏览

python - 在连接处于活动状态时更改 IP(半开连接)

在我的项目中,有一个基于 TCP 协议的双向连接。一个等待信息(PC),另一个发送它(电话)。

我注意到,如果我在设备之间的连接处于活动状态时更改手机的 WiFi 连接(IP 地址),PC 端不知道手机已经断开连接。

我认为这被称为半开连接,据我了解,PC端必须发送一些空消息才能检测到断开连接,但我无法做到这一点。我尝试使用socket.send("".encode("utf-8")),但它似乎没有调用任何错误。

即使一侧断开,连接是否仍然存在?PC 如何使用 Python 检测到这个问题?

另外,如果我在recv命令运行时从套接字(在不同的线程中)发送信息会发生什么?

0 投票
0 回答
50 浏览

tcp - 有什么方法可以知道 Netty 中的 4 次关闭握手是否完成?

我正在开发 netty tcp 客户端服务。

我的问题

在我的服务调用 channel.close() 之后,有没有办法知道服务器是否也调用了 channel.close()?换句话说,有没有办法知道 4 次关闭握手是否完成?

背景

我的服务与一个目标设备(服务器端)进行通信,该设备具有以下一些限制

  • 它只允许一个客户端连接。
  • 如果已经存在连接,请立即关闭新连接。
  • 即使连接处于半关闭状态,它也会将先前的连接视为活动连接。

我的代码大致如下运行。

当第二次循环建立新连接时,服务器关闭新连接,因为第一次循环使用的连接仍处于半关闭状态。

如果看下面的抓包,可以看到(1)处于Half Closed状态,(2)建立了新的连接,(3)服务器通知bad connection state并强行关闭新的连接。

他

因此,我们可以通过添加 sleep 来简单地等到 4 次握手完成,如下所示。

但我想要一个更好的方法。