TCP套接字:检测对等方是不是在发送前关闭? (Linux)

     2023-02-17     235

关键词:

【中文标题】TCP套接字:检测对等方是不是在发送前关闭? (Linux)【英文标题】:TCP socket: detect if peer has shut down before sending? (Linux)TCP套接字:检测对等方是否在发送前关闭? (Linux) 【发布时间】:2012-09-06 11:55:16 【问题描述】:

是否有任何直接命令来检测对等方是否在发送之前关闭/关闭其套接字?

我这样做:

int sendResult = send( mySD, bufferPtr, numberToSend, MSG_NOSIGNAL );

send() 确实很乐意接受该消息并似乎发送它(正返回值),只有 下一次 我尝试发送它时返回错误。这意味着:我收到警告 1 消息太晚了。

是的,我之前使用的是select(),但即使对等方已关闭,它仍然返回 1。

作为一种解决方法,我可以在调用 send() 之前直接使用 recv() 执行 0 字节读取,这会告诉我“连接正常”(-1) 或“对等关闭”(0) 并且几乎没有工作:

int readTest = recv( mySD, NULL, 0, MSG_DONTWAIT | MSG_PEEK );

但是从语义的角度来看,当我真正想要发送时,阅读确实“感觉”不对,我真正想要的只是一个测试时间>。那么是否有诸如“套接字状态”之类的命令,我可以直接找出我需要什么? recv() 内部使用的那种东西?

【问题讨论】:

从语义的角度来看,当您真正想要检查对等方是否已关闭并随后发送时,它确实没有感觉不对。如果您想知道您的对等方是否已关闭,那么您需要找出它,在这种情况下只需调用 read 即可。 显示您对select() 的呼叫。有可能第三组 (exceptfds) 可以用来检测这一点。 int selectRes = select(mySD + 1, NULL, &tempSDSet, NULL, &timeout); @unwind 否。传入的关闭是读取事件,而不是异常事件。 猜猜我得到了全貌:“Peer close”是一个读取事件,因此为 read 调用 select() 会产生“true”,因此我进行了读取(例如与recv()) 并得到“0”,它告诉我发生了什么。感谢大家的贡献和帮助我理解! 【参考方案1】:

由于您的程序是基于选择的,我相信您为读取和写入 fd 集注册了套接字。如果是,您将获得 read fd set 的选择返回,并且您将“recv”最终为“0”并因此关闭套接字。

【讨论】:

我使用不同的选择进行读写。所以你建议做类似select( mySD + 1, &tempSDSet, &tempSDSet, NULL, &timeout ); 的事情?我试试看,谢谢! 如果你有单线程进程,你必须有一个非常充分的理由让两个选择分别用于读取和写入 fds。 应用程序就是这样构建的。通常,它只向服务器发送消息,只有在这里,然后它必须读取前一个请求的答案。所以读和写是分开处理的,如果需要的话,在更高的层次上组合成一个“请求操作”。【参考方案2】:

我想套接字之上的协议确实实现了乒乓机制是有原因的?

最好的,彼得

【讨论】:

这不是答案。有些人可能会对你投反对票,只是说。 从语法上讲你是完全正确的。感谢您的说明,也感谢您不降级。然而,问题可以暗示答案,就像在这种情况下我打算说:“看,说你是否在套接字层上连接被认为是一件不平凡的事情,否则人们不会费心去实现 pings 和 pongs。不可靠。对你来说最简单的方法是包括一个简单的乒乓机制。够公平吗? 我认为有这样的问题。 @ilmiacs:我真的很想在应用程序级别实现请求-应答协议(因此:我发送消息,对等方必须确认每个收据)。但是,要处理的协议已经给定了,而且是固定的,并没有提供这种东西(我发了一个消息,没有得到答复),所以我必须依赖 TCP 机制。这些消息可能每分钟(甚至更长)发生一次,因此向用户发出错误信号(设备上的 LED)应该尽快发生,因此在消息已(未)发送后立即发生,而不是在 next 之后 消息。 好的,相信了。我在这里很新。感谢您的建议。我可以删除我的“答案”吗?

在 TCP 中检测到其他对等方已关闭

】在TCP中检测到其他对等方已关闭【英文标题】:DetectingtheotherpeerisdowninTCP【发布时间】:2013-02-2509:27:37【问题描述】:我正在构建一个基于TCP的APP,为了检测另一端宕机,我需要实现一个心跳机制,让客户端不断发送伪ping数据... 查看详情

libevent 如何检测到套接字已关闭

】libevent如何检测到套接字已关闭【英文标题】:howlibeventdetectthatasocketisclosed【发布时间】:2013-05-2222:52:29【问题描述】:如果我将特定套接字的事件添加到事件循环,例如,一个TCP连接套接字。那么可能会发生套接字关闭,那... 查看详情

在 webrtc 视频聊天中检测到对等方的浏览器已关闭

】在webrtc视频聊天中检测到对等方的浏览器已关闭【英文标题】:Detectingthatthepeer\'sbrowserwasclosedinawebrtcvideochat【发布时间】:2014-02-0914:42:11【问题描述】:我一直在实施webrtc视频聊天。除了对等端关闭浏览器的情况外,一切都很... 查看详情

浏览器上的 GCDAsyncSocket 立即连接和断开连接,并出现“远程对等方关闭套接字”错误

...DAsyncSocket立即连接和断开连接,并出现“远程对等方关闭套接字”错误【英文标题】:GCDAsyncSocketonbrowserconnectsanddisconnectsimmediatelywith"Socketclosedbyremotepeer"error【发布时间】:2014-11-1323:14:51【问题描述】:我对网络编程和第... 查看详情

对等方重置 HttpClient 连接:套接字写入错误

】对等方重置HttpClient连接:套接字写入错误【英文标题】:HttpClientConnectionresetbypeer:socketwriteerror【发布时间】:2016-04-1222:00:21【问题描述】:我使用httpclient4.4发送get和post请求。我刚刚创建了一个简单的httpclient包装器以便于使... 查看详情

so_linger选项

...的值被忽略,等于内核缺省情况,如果有数据残留在socket发送缓冲区中则系统将继续发送这些数据给对方,等待被确认,然后返回。最终关闭按照四次握手time-wait进行关闭。也就是所有数据都发送完成以后,才会发送fin,这种默... 查看详情

通过 Socket TCP/IP 发送数据时出错

...:2018-08-2720:35:49【问题描述】:下午好。我正在尝试通过套接字(在c#中详细说明)将流发送到javascript中的websocket发送的数据较少。我收到一个我不知道以下内容的错误:“无法将数据写入传输连接:连接被对等方重置。”代码... 查看详情

C - 填充 TCP 套接字发送缓冲区

】C-填充TCP套接字发送缓冲区【英文标题】:C-fillingTCPsocketsendbuffer【发布时间】:2014-05-1018:14:46【问题描述】:我正在尝试编写一个实验性的客户端/服务器程序,以证明当发送缓冲区已满时写入是否失败或阻塞。基本上,我在... 查看详情

tcp连接的状态(代码片段)

...T主动打开的状态而服务端属于被动打开,会执行创建套接字、绑定、监听套接字的状态,在收到客户端的连接后,即收到客户端是SYN,会发送自己SYN并回复ACK确认信息(三次握手第二步),会 查看详情

Linux TCP 套接字崩溃

】LinuxTCP套接字崩溃【英文标题】:LinuxTCPsocketcrash【发布时间】:2011-10-1919:29:28【问题描述】:我编写了通过LinuxTCP套接字进行通信的网络应用程序。最近我注意到发送系统调用使我的应用程序崩溃。当两个对等方都启动时它工... 查看详情

如何控制对等端的套接字[TCP打孔]

】如何控制对等端的套接字[TCP打孔]【英文标题】:Howtocontrolsocketonpeer[TCPHolePunching]【发布时间】:2012-10-1813:29:02【问题描述】:我有一个使用TCP连接进行通信的服务器-客户端程序。多个客户端可以同时连接到服务器。我想在这... 查看详情

tcp三次握爪四次挥手

...是否成功送达。握手中使用了TCP的标志:SYN和ACK    发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。    最后,发送端再回传一个带ACK标志的数据包... 查看详情

tcp传输的三次握手四次挥手策略

...达。握手过程中使用了tcp的标志:syn和ACk。   发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,会穿一个带有syn/ack标志的数据包以示传达确认信息。   最后,发送端再回传一个带ACK标志的数据... 查看详情

TCP 套接字关闭但未被进程检测到

】TCP套接字关闭但未被进程检测到【英文标题】:TCPsocketclosingbutnotdetectedbyprocess【发布时间】:2015-09-1406:35:40【问题描述】:我有一个允许连接的服务器,然后根据它接收到的消息,服务器应该做一些事情(目前尚未实现)但是... 查看详情

tcp传输的三次握手和四次挥手简单的理解

三次握手用于传送信息,传送方发送一个信息SYN,请求与接受方建立连接,接受方收到信息的话,发送一个数据包SYN/ACK,这个数据包的意思大致是我已经收到了这个信息,发送端收到了这个数据包之后,在发送一个信息ACK给接... 查看详情

强制多人连接关闭

...有办法结束(ios7)多点连接?例如,不是完全断开本地对等点,而是只是禁用与特定对等点的连接?【问题讨论】:【参考方案1】:您可以与MCSession断开连接的唯一对等方是您自己,因此您需要为您连接的每个对等方创建一个... 查看详情

“对等方重置连接”是啥意思?

】“对等方重置连接”是啥意思?【英文标题】:Whatdoes"connectionresetbypeer"mean?“对等方重置连接”是什么意思?【发布时间】:2010-11-2821:35:08【问题描述】:TCP连接上的“connectionresetbypeer”错误是什么意思?是致命错误... 查看详情

ClientAbortException:java.net.SocketException:对等方重置连接:套接字写入错误[重复]

...ClientAbortException:java.net.SocketException:对等方重置连接:套接字写入错误[重复]【英文标题】:ClientAbortException:java.net.SocketException:Connectionresetbypeer:socketwriteerror[duplicate]【发布时间】:2010-10-2418:28:29【问题描述】:我在从数据库列... 查看详情