dounuo9921
2013-03-24 06:37
浏览 126
已采纳

URL监视器在netstat中生成多个ESTABLISHED(连接)条目

I wrote a URL monitor program in Go, but after a period of time I found many ESTABLISHED entries in netstat -nao|grep 80.

The getHttpStatusCode func:

    HttpClient = &http.Client{
        Transport: &http.Transport{
            Dial: func(netw, addr string) (net.Conn, error) {
                deadline := time.Now().Add(30 * time.Second)
                c, err := net.DialTimeout(netw, addr, 20*time.Second)
                if err != nil {
                    return nil, err
                }

                c.SetDeadline(deadline)
                c.SetReadDeadline(deadline)
                c.SetWriteDeadline(deadline)
                return c, nil
            },
        },
    }

// ...

func getHttpStatusCode(url string) int {
    if url == "" {
        return 200
    }

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return 0
    }

    req.Close = true
    req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17")
    resp, err := HttpClient.Do(req)
    if err != nil {
        return 0
    }

    defer resp.Body.Close()
    return resp.StatusCode
}

I checked the Go manual and don't find something like req.Close() and just defer resp.Body.Close().

Here is the output of netstat -nao | grep 80:

tcp 1343352 0 192.168.2.33:29581 220.181.155.19:80 ESTABLISHED off (0.00/0/0)

And the output of tcpdump tcp port 80:

14:32:54.085095 IP 113.12.80.13.http > wk_0_mysql.KIDC90805.zw.39174: Flags [.], seq 17376:18824, ack 1, win 42, options [nop,nop,TS val 4236145017 ecr 204896351], length 1448
14:32:54.109206 IP wk_0_mysql.KIDC90805.zw.25834 > 220.181.90.8.http: Flags [S], seq 714805337, win 14600, options [mss 1460,sackOK,TS val 204896416 ecr 0,nop,wscale 9], length 0
14:32:54.223349 IP 220.181.155.22.http > wk_0_mysql.KIDC90805.zw.19262: Flags [.], seq 864939135:864940583, ack 1630899997, win 42, options [nop,nop,TS val 1570834172 ecr 204896529], length 1448
14:32:54.223352 IP wk_0_mysql.KIDC90805.zw.19262 > 220.181.155.22.http: Flags [.], ack 1448, win 1301, options [nop,nop,TS val 204896530 ecr 1570834172], length 0
14:32:54.223432 IP 220.181.155.10.http > wk_0_mysql.KIDC90805.zw.27376: Flags [.], seq 3889371684:3889373132, ack 1106685068, win 42, options [nop,nop,TS val 3866364254 ecr 204896529], length 1448
14:32:54.223436 IP wk_0_mysql.KIDC90805.zw.27376 > 220.181.155.10.http: Flags [.], ack 1448, win 594, options [nop,nop,TS val 204896530 ecr 3866364254], length 0
14:32:54.275774 IP 121.12.101.130.http > wk_0_mysql.KIDC90805.zw.63329: Flags [.], seq 1314475629:1314477089, ack 642951590, win 54, length 1460
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dqce48404 2013-03-24 07:17
    已采纳

    The HTTP client will by default use keep-alive connections, you can close them by calling transport.CloseIdleConnections (from the docs).

    I'm not sure req.Close does anything on client requests, it might only be for the server.

    点赞 打赏 评论

相关推荐 更多相似问题