两个 golang 程序,一个实现通用的功能,接口是 udp server ;
另一个根据业务处理数据,并提供 http 接口;
另外一个 shell 脚本,用 curl 定时调用 http 接口,间接调用了 udp 接口。
结果 netstat 发现与 udp 的连接越来越多,偶尔会减一个,总体一直在增长;
netstat 发现进程 id 是提供 http 接口的那个程序,我使用的是短连接,net.Dial 后,就 defer conn.Close(),按理说肯定能关闭,事实也是并非连接数量不减小,但减小速度太慢了。

|      1chennqqi      2019-12-20 11:18:13 +08:00 你 defer 是不是在循环中 或者异步的,贴代码吧 | 
|      2julyclyde      2019-12-20 11:26:00 +08:00  1 udp 哪儿来的连接! | 
|  |      3Immortal      2019-12-20 11:31:08 +08:00 你看了 netstat 后面的连接状态了么? | 
|  |      4Immortal      2019-12-20 11:31:35 +08:00 linux 内核有个连接回收间隔时间的设置 调整下试试 | 
|  |      5Leigg      2019-12-20 11:39:29 +08:00 via Android http 是基于 tcp 的,你最后一段话是说的与 http 程序的连接不断? tcp 连接即使由一端关闭也不会马上释放,udp 貌似一样的 | 
|      6koebehshian OP @Immortal 状态是 established | 
|      7koebehshian OP @chennqqi 连接 udp 专门写了个函数,这个函数在 http.HandleFunc("/api/xxx", func (w http.ResponseWriter, r *http.Request){ 调用了连接 udp 的函数 }) | 
|  |      9index90      2019-12-20 12:04:09 +08:00 @koebehshian 你还能看到状态,你确定你的情况是 udp 链接越来越多? | 
|      10koebehshian OP @Leigg udp 服务那边没关闭,可能就是这个原因,我怀疑过,但加了关闭连接以后,好像是关得太快,客户端那边收不到回复了 | 
|  |      11sagaxu      2019-12-20 12:16:31 +08:00 via Android  3 udp 连接和 tcp 粘包更配哦 | 
|      12koebehshian OP @Leigg 我刚才又试了一下 go 一个线程 sleep 一下再关掉连接,发现直接客户端收不到数据了,仔细一看代码,udp 服务端只有一个句柄,调的 Readfrom 函数,所以不能关 | 
|      13koebehshian OP  | 
|      14koebehshian OP @index90 我加了图,netstat 命令输出有 udp | 
|      15koebehshian OP @Immortal 你说的具体怎么调整 | 
|  |      16ipwx      2019-12-20 12:47:18 +08:00 via Android udp 从协议设计上就只有超时没有关闭 | 
|      17koebehshian OP @ipwx 我看了 golang UDPConn.Close 方法的源码,是 close 了一个文件描述符,对比 BSD socket 的 UDP 客户端,也有一个 fd 需要关闭 | 
|      18chennqqi      2019-12-20 14:11:40 +08:00 @koebehshian 你贴一下代码吧,怎么建立连接,怎么关闭的 | 
|      19mengzhuo      2019-12-20 14:12:50 +08:00 via iPhone 没有回包的接口,Send 完就 close,兜底 Settimeout 就好了 有回包的,收到就 close,然后记得发的时候加 cookie | 
|  |      20index90      2019-12-20 14:22:06 +08:00  1 提供 http 服务的那个程序,是不是从 udp 读取数据啊?如果没有设置超时时间,而服务端又没有返回,或者数据丢了,都会导致客户端一直等待的哦。最好把你连接 udp 的函数贴一下 | 
|      21koebehshian OP 解决了,是 Read 前没有调 SetReadDeadline | 
|  |      22realpg PRO 我比较好奇你这是什么神仙 netstat 能给一个本机 udp 出 established 的状态 | 
|      23koebehshian OP | 
|      24koebehshian OP @realpg https://github.com/ecki/net-tools/blob/master/netstat.c 第 1288 行`udp_state = _("ESTABLISHED");` | 
|  |      25catror      2019-12-20 22:05:08 +08:00 via Android 业务程序也用 ListenUDP 就行了,用 DialUDP 确实会有连接 |