如何让 TCP 出现 Accept()错误?

2022-07-20 15:10:13 +08:00
 vczyh
	ctx := context.Background()

	for {
		conn, err := l.listener.Accept()
		if err != nil {
			// Close() was probably called.
        	// 想要走到这里,执行这行代码
			connRefuse.Add(1)
			return
		}

		acceptTime := time.Now()

		connectionID := l.connectionID
		l.connectionID++

		connCount.Add(1)
		connAccept.Add(1)

		go func() {
			if l.PreHandleFunc != nil {
				conn, err = l.PreHandleFunc(ctx, conn, connectionID)
				if err != nil {
					log.Errorf("mysql_server pre hook: %s", err)
					return
				}
			}

			l.handle(conn, connectionID, acceptTime)
		}()
	}
2476 次点击
所在节点    Linux
11 条回复
MoYi123
2022-07-20 15:53:24 +08:00
如果是需要单元测试, 那么就使用 gomock 等工具
如果是需要学习, 那么可以看 accept 里的代码.
pagxir
2022-07-20 16:22:46 +08:00
ctrl+c 就可以了
pagxir
2022-07-20 16:28:21 +08:00
accept 比较容易触发的简单错误是 fd 消耗完,信号中断,连接异常,设置超时,这几个。
DefoliationM
2022-07-20 16:39:13 +08:00
l.listener.Close()
aladdinding
2022-07-20 16:44:13 +08:00
too many fd
danbai
2022-07-20 17:21:27 +08:00
修改 tcp 最大连接数
Crawping
2022-07-20 17:54:28 +08:00
fd 耗尽
Misakas
2022-07-21 11:41:07 +08:00
歪个楼,有没有朋友能讲一下 fd 是哪两个单词的缩写
yingqiuQAQ
2022-07-21 11:42:31 +08:00
@Misakas 文件描述符 file descriptor
zizon
2022-07-21 12:44:45 +08:00
Accept 方法 override 一下不就完了...
random return error
vczyh
2022-07-25 09:39:36 +08:00
感谢大家的回复,大体意思我明白了,我设置一下最大 fd

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867547

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX