Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检测TCP连接无法打开或终止的时间

检测TCP连接无法打开或终止的时间
EN

Stack Overflow用户
提问于 2021-01-23 10:46:43
回答 1查看 66关注 0票数 2

我正在通过双工句柄h读取和写入TCP套接字。

在客户端:

代码语言:javascript
运行
AI代码解释
复制
sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
connect sock $ addrAddress addr
h <- getSocketHandle conn

在服务器中:

代码语言:javascript
运行
AI代码解释
复制
sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
setSocketOption sock ReuseAddr 1
withFdSocket sock setCloseOnExecIfNeeded
bind sock $ addrAddress addr
listen sock 1024
forever $ do
  (conn, _) <- accept sock
  h <- getSocketHandle conn
  forkFinally (server h) (const $ hClose h)

其中:

代码语言:javascript
运行
AI代码解释
复制
getSocketHandle :: Socket -> IO Handle
getSocketHandle conn = do
  h <- socketToHandle conn ReadWriteMode
  hSetBinaryMode h True
  hSetNewlineMode h NewlineMode {inputNL = CRLF, outputNL = CRLF}
  hSetBuffering h LineBuffering
  return h

当客户端和服务器都可用时,一切正常,但是当TCP连接终止时,例如因为客户端或服务器退出,什么都不会发生-- hGetLine/hPutStrLn只是阻塞线程。

怎样才能让他们抛出异常呢?

类似地,如果客户端连接失败(例如,因为服务器没有响应),connect也会被阻塞。

我想我应该以某种方式设置套接字上的超时,但尝试套接字选项并没有太大的变化-我尝试了SO_LINGER,SO_KEEPALIVE,SO_USER_TIMEOUT似乎不被系统支持(当我试图获取它时它阻塞了),SO_RCVTIMEO / SO_SNDTIMEO似乎不被Network.Socket支持-至少文档是这么说的……

对于connect/hPutStrLn,我可以使用来自System.Timeouttimeout (这似乎是个技巧,但它可以工作),但是对于hGetLine/hGet,它不能工作-它只能等待用户输入,所以它应该只在连接终止时抛出异常。

我可能只需要阅读网络编程--我希望能很快弄明白……任何帮助都是非常感谢的。

编辑:看起来我应该使用更低级的send/sendAllrecv,在我的代码中做缓冲和剪切到行(或者一个字节接一个字节地读--它可能会像listen中设置的那样被缓冲),并将recv返回的0长度视为断开连接。有没有办法通过处理更高级别的函数来让它工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-24 09:26:10

多亏了K. A. Buhr的建议,我发现这个问题与句柄/套接字无关,而且确实正确地抛出了异常。

正在运行的最小客户端/服务器设置:https://gist.github.com/epoberezkin/d6063c0d8f6e95d9e606652565113413

它基于Network.Socket包中的示例,但处理多个已解析的地址,并使用句柄读/写套接字。

真正的问题是由于在某些情况下没有正确处理异常,而不是像这样的东西:

代码语言:javascript
运行
AI代码解释
复制
race (send h) (receive h) `finally` disconnected

我做到了

代码语言:javascript
运行
AI代码解释
复制
race (send h) (receive h) >> disconnected
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65858284

复制
相关文章
精品:TCP连接的建立和终止
TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。
看、未来
2020/08/26
7950
精品:TCP连接的建立和终止
TCP连接是如何建立和终止的?
服务器在客户端建立连接时刚好断电。可以看出客户端进行了重试,但是重试之间的时间间隔第一次是5.81秒,而第二次间隔是24.00秒。
爬蜥
2019/07/08
1.7K0
TCP连接是如何建立和终止的?
TCP连接异常终止(RST包)场景分析
TCP的异常终止是相对于正常释放TCP连接的过程而言的,我们都知道,TCP连接的建立是通过三次握手完成的,而TCP正常释放连接是通过四次挥手来完成。但是有些情况下,TCP在交互的过程中会出现一些意想不到的情况,导致TCP无法按照正常的三次握手建立连接或四次挥手来释放连接。如果此时不通过其他的方式来释放TCP连接的话,这个TCP连接将会一直存在,占用系统的资源。在这种情况下,我们就需要有一种能够释放TCP连接的机制,这种机制就是TCP的reset报文。reset报文是指TCP报头的标志字段中的reset位置一的报文,如下图所示:
全栈程序员站长
2022/11/15
4.5K0
TCP连接异常终止(RST包)场景分析
【Mac】APP无法打开或文件损坏的处理方法
在 MAC 下安装一些软件时提示”来自身份不明开发者“,其实这是MAC新系统启用了新的安全机制。 默认只信任 Mac App Store 下载的软件和拥有开发者 ID 签名的应用程序。
redszhao
2021/08/09
1.3K0
【Mac】APP无法打开或文件损坏的处理方法
mac 无法打开22端口 无法远程连接ssh 的解决办法
mac 无法远程连接 原因是22端口没有打开 尝试通过命令行打开22端口 依然失败!! 解决办法:手动设置 ①打开系统偏好设置-共享 ②勾选远程登录并添加用户 现在再试一下远程ssh ,已经可以成功连接了!
小黑同学
2021/12/06
3.8K0
mac 无法打开22端口 无法远程连接ssh 的解决办法
windows10无法打开onedrive-打开onedrive提示文件或目录损坏且无法读取
今天电脑开机,发现onedrive没有随着开机自启,于是在搜索栏搜到onedrive应用,手动点击,没有任何反应
承世
2023/04/07
7.1K0
windows10无法打开onedrive-打开onedrive提示文件或目录损坏且无法读取
PHP curl或file_get_contents下载图片损坏或无法打开
通过curl或者file_get_contents获取抓取远程图片并且保存到本地,发现损坏了很多图片,比如访问
超级小可爱
2023/02/20
1.4K0
Mac应用程序无法打开或文件损坏的处理方法
错误截图 当遇到这种情况,真的损坏了么?是不是真的要移动到废纸篓呢?遇到这样的情况,通常是打开任何来源即可轻松解决,下面讲一下Mac应用程序无法打开或文件损坏的处理方法,解答Mac没有任
骤雨重山
2022/05/30
3.9K0
Mac应用程序无法打开或文件损坏的处理方法
内存或磁盘空间不足,excel无法再次打开_打开文件显示内存或磁盘空间不足
在网络上下载的文件,使用EXCEL打开的时候提示“内存或磁盘空间不足,Microsoft Excel 无法再次打开或保存任何文档。”,针对这个问题,装机之家小编特地在网上搜罗了具体解决方法,但是网上提供的增加虚拟内存的方法,并不能解决该问题,不过经过小编琢磨,终于找到能够解决该问题的方法,下面装机之家分享一下内存或磁盘空间不足 excel无法再次打开解决方法,来看看吧!
全栈程序员站长
2022/09/21
5.5K0
内存或磁盘空间不足,excel无法再次打开_打开文件显示内存或磁盘空间不足
Python代理无法连接或连接不稳定故障排除指南
在使用Python进行网络爬虫或访问外部资源时,经常会遇到代理无法连接或连接不稳定的问题。本文将提供一份详细的故障排除指南,帮助你解决Python代理连接问题,确保顺利进行网络操作。
华科云商小彭
2023/08/25
4790
Python代理无法连接或连接不稳定故障排除指南
localhost或127.0.0.1无法连接到mysql的解决方案
在my.ini文件中加入bind-address = 127.0.0.1便可解决该问题
wuweixiang
2018/08/14
3.9K0
localhost或127.0.0.1无法连接到mysql的解决方案
java中跳出或终止if语句的方法
break:跳出当前循环;但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环。
Java架构师必看
2021/12/21
5.6K1
Android检测网络是否可用并打开、扫描、连接WIFI
需求:要求先检查网络是否可用,如果可用就跳过网络设置界面,如果不可用就打开WIFI并扫描网络后去手动输入密码连接
程序员飞飞
2020/02/27
2.9K0
[TCP] tcp连接SYN超时重传次数和超时时间
当tcp进行三次握手的时候 , 第一步是客户端发送syn请求 , 服务端返回syn+sck , 客户端响应sck
唯一Chat
2021/04/22
8.8K0
SaveFileDialog无法打开
当前画面是报表画面,没用线程。主画面点击按钮,打开该画面,是在子线程中打开的,所以SaveFileDialog也无法直接打开
全栈程序员站长
2022/11/10
2K0
IReport无法打开的原因
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说IReport无法打开的原因,希望能够帮助大家进步!!!
Java架构师必看
2021/11/30
2.3K0
IReport无法打开的原因
matlab中importdata无法打开文件_importdata无法打开文件
最近使用importdata函数不能读取全部数据,数据集315行,但是读取了197行,那就是197-198之间有问题,百度之后有了思路。由于没有找到具体的证据,所以这里说一下解决思路。
全栈程序员站长
2022/11/16
6.4K0
matlab中importdata无法打开文件_importdata无法打开文件
Visual Studio 2017 “无法查找或打开PDB文件“ 解决方法
我这儿选择使用http://msdl.microsoft.com/download/symbols,然后选择路径。
全栈程序员站长
2022/08/22
6.7K1
Visual Studio 2017 “无法查找或打开PDB文件“ 解决方法
点击加载更多

相似问题

检测TCP连接丢失的时间

23

TCP连接终止

10

终止连接TCP

13

终止现有tcp连接

21

Ruby on Rails:无法打开TCP连接

28
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档