TCP的conn.Read方法中的err来判断一次读取是否成功,但无法读到io.EOF来判断用户已经断开连接。

13268609770 · 2021-12-14 22:41:30 · 1512 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-12-14 22:41:30 的主题,其中的信息可能已经有所发展或是发生改变。

image.png 在网上查了,可以通过判断err是否为io.EOF来判断用户是否与服务端断开连接,但这行代码始终没有执行 (客户端是直接通过Ctrl + C结束的)


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1512 次点击  
加入收藏 微博
6 回复  |  直到 2021-12-17 14:52:18
liangmanlin
liangmanlin · #1 · 3年之前

这个代码绝了,defer放在最后,这公司怕是要倒闭

zzustu
zzustu · #2 · 3年之前

先不说defer的问题

  1. 怕不是c.clientJsonProcess()这个方法阻塞了吧
  2. 看看 conn.Read() 的实现是怎么写的,或许把 io.EOF 转换成了其它错误
13268609770
13268609770 · #3 · 3年之前

@liangmanlin @zzustu 感谢大佬的回复,我是一个初学者,defer这个东西只是看了视频这样用没研究原理,哈哈。这个项目是个练习。

1、c.clientJsonProcess()方法是没有阻塞的,正常判断Read返回的err不为空可以得知接收客户端的消息失败了。但是判断EOF就不行了 2、conn.Read()不知道怎么实现的,目前还看不懂这些,但是Read的err如果不为空,那么返回的内容是:read tcp 127.0.0.1:8888->127.0.0.1:53026: wsarecv: An existing connection was forcibly closed by the remote host.

liangmanlin
liangmanlin · #4 · 3年之前
1326860977013268609770 #3 回复

@liangmanlin @zzustu 感谢大佬的回复,我是一个初学者,defer这个东西只是看了视频这样用没研究原理,哈哈。这个项目是个练习。 1、c.clientJsonProcess()方法是没有阻塞的,正常判断Read返回的err不为空可以得知接收客户端的消息失败了。但是判断EOF就不行了 2、conn.Read()不知道怎么实现的,目前还看不懂这些,但是Read的err如果不为空,那么返回的内容是:read tcp 127.0.0.1:8888->127.0.0.1:53026: wsarecv: An existing connection was forcibly closed by the remote host.

tcp的错误基本上都是不可恢复的,都可以判定断开,判断错误的类型其实意义不大,让客户端从新链接更加便捷

13268609770
13268609770 · #5 · 3年之前

@liangmanlin 好的,谢谢

Mericusta
Mericusta · #6 · 3年之前

https://zhuanlan.zhihu.com/p/445205415

net 库里面其他的实现同理

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传