[golang]明明关闭了 udp 连接,但 netstat 显示连接越来越多,偶尔会减一个,但减小的速度远远慢于增加的速度 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
这是一个创建于 2126 天前的主题,其中的信息可能已经有所发展或是发生改变。

两个 golang 程序,一个实现通用的功能,接口是 udp server ;

另一个根据业务处理数据,并提供 http 接口;

另外一个 shell 脚本,用 curl 定时调用 http 接口,间接调用了 udp 接口。

结果 netstat 发现与 udp 的连接越来越多,偶尔会减一个,总体一直在增长;

netstat 发现进程 id 是提供 http 接口的那个程序,我使用的是短连接,net.Dial 后,就 defer conn.Close(),按理说肯定能关闭,事实也是并非连接数量不减小,但减小速度太慢了。

第 1 条附言    2019-12-20 12:32:29 +08:00

QOnAdP.png

26 条回复    2019-12-20 22:10:19 +08:00
chennqqi
    1
chennqqi  
   2019-12-20 11:18:13 +08:00
你 defer 是不是在循环中 或者异步的,贴代码吧
julyclyde
    2
julyclyde  
   2019-12-20 11:26:00 +08:00   1
udp 哪儿来的连接!
Immortal
    3
Immortal  
   2019-12-20 11:31:08 +08:00
你看了 netstat 后面的连接状态了么?
Immortal
    4
Immortal  
   2019-12-20 11:31:35 +08:00
linux 内核有个连接回收间隔时间的设置 调整下试试
Leigg
    5
Leigg  
   2019-12-20 11:39:29 +08:00 via Android
http 是基于 tcp 的,你最后一段话是说的与 http 程序的连接不断? tcp 连接即使由一端关闭也不会马上释放,udp 貌似一样的
koebehshian
    6
koebehshian  
OP
   2019-12-20 11:53:23 +08:00
@Immortal 状态是 established
koebehshian
    7
koebehshian  
OP
   2019-12-20 12:00:29 +08:00
@chennqqi 连接 udp 专门写了个函数,这个函数在 http.HandleFunc("/api/xxx", func (w http.ResponseWriter, r *http.Request){
调用了连接 udp 的函数
})
index90
    8
index90  
   2019-12-20 12:03:00 +08:00
@Immortal #3 udp 没有状态的
index90
    9
index90  
   2019-12-20 12:04:09 +08:00
@koebehshian 你还能看到状态,你确定你的情况是 udp 链接越来越多?
koebehshian
    10
koebehshian  
OP
   2019-12-20 12:10:25 +08:00
@Leigg udp 服务那边没关闭,可能就是这个原因,我怀疑过,但加了关闭连接以后,好像是关得太快,客户端那边收不到回复了
sagaxu
    11
sagaxu  
   2019-12-20 12:16:31 +08:00 via Android   3
udp 连接和 tcp 粘包更配哦
koebehshian
    12
koebehshian  
OP
   2019-12-20 12:22:35 +08:00
@Leigg 我刚才又试了一下 go 一个线程 sleep 一下再关掉连接,发现直接客户端收不到数据了,仔细一看代码,udp 服务端只有一个句柄,调的 Readfrom 函数,所以不能关
koebehshian
    13
koebehshian  
OP
   2019-12-20 12:28:12 +08:00
koebehshian
    14
koebehshian  
OP
   2019-12-20 12:45:30 +08:00
@index90 我加了图,netstat 命令输出有 udp
koebehshian
    15
koebehshian  
OP
   2019-12-20 12:46:02 +08:00
@Immortal 你说的具体怎么调整
ipwx
    16
ipwx  
   2019-12-20 12:47:18 +08:00 via Android
udp 从协议设计上就只有超时没有关闭
koebehshian
    17
koebehshian  
OP
   2019-12-20 12:58:27 +08:00
@ipwx 我看了 golang UDPConn.Close 方法的源码,是 close 了一个文件描述符,对比 BSD socket 的 UDP 客户端,也有一个 fd 需要关闭
chennqqi
    18
chennqqi  
   2019-12-20 14:11:40 +08:00
@koebehshian 你贴一下代码吧,怎么建立连接,怎么关闭的
mengzhuo
    19
mengzhuo  
   2019-12-20 14:12:50 +08:00 via iPhone
没有回包的接口,Send 完就 close,兜底 Settimeout 就好了
有回包的,收到就 close,然后记得发的时候加 cookie
index90
    20
index90  
   2019-12-20 14:22:06 +08:00   1
提供 http 服务的那个程序,是不是从 udp 读取数据啊?如果没有设置超时时间,而服务端又没有返回,或者数据丢了,都会导致客户端一直等待的哦。最好把你连接 udp 的函数贴一下
koebehshian
    21
koebehshian  
OP
   2019-12-20 14:45:57 +08:00
解决了,是 Read 前没有调 SetReadDeadline
realpg
    22
realpg  
PRO
   2019-12-20 18:16:33 +08:00
我比较好奇你这是什么神仙 netstat 能给一个本机 udp 出 established 的状态
koebehshian
    24
koebehshian  
OP
   2019-12-20 21:35:22 +08:00
@realpg https://github.com/ecki/net-tools/blob/master/netstat.c 第 1288 行`udp_state = _("ESTABLISHED");`
catror
    25
catror  
   2019-12-20 22:05:08 +08:00 via Android
业务程序也用 ListenUDP 就行了,用 DialUDP 确实会有连接
catror
    26
catror  
   2019-12-20 22:10:19 +08:00 via Android
@catror Dial 之后的连接不是 UDP 协议概念上的连接,而是代码实现上的,connected UDP socket
关于     帮助文档     自助推广系统     博客     API &nbs;   FAQ     Solana     2970 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 25ms UTC 00:21 PVG 08:21 LAX 17:21 JFK 20:21
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86