can't assign requested address 錯誤解決

astaxie發表於2017-05-04

最近一直在寫新版本的beego2,在做MUX測試的時候遇到了這個問題,

BenchmarkBeegoMuxRequests-8         panic: Post http://127.0.0.1:59079/repos/: ... ests: dial tcp 127.0.0.1:59079: connect: can't assign requested address

這個錯誤看上去是我的測試耗掉了所有的local port,但是local port 不應該是複用的嗎?

我的測試裡面的程式碼片段是這樣的:

for _, route := range routes {
    res, err := Request(route.method, ts.URL+route.path)
    if err != nil {
        panic(err)
    }
    res.Body.Close()
}

這個時候我去翻看了一下response裡面的body的文件

// The default HTTP client's Transport does not
// attempt to reuse HTTP/1.0 or HTTP/1.1 TCP connections
// ("keep-alive") unless the Body is read to completion and is
// closed.

大家看到裡面的話,只有當body讀取並關閉,而我上面的程式碼只是關閉了,Body並沒有讀取。所以導致了client沒有reuse TCP connection。

所以這個完全明白了,我們必須在關閉之前完全的讀取Body裡面的資料,我把原來的程式碼改成了下面之後就解決了問題

for _, route := range routes {
    res, err := Request(route.method, ts.URL+route.path)
    if err != nil {
        panic(err)
    }
    io.Copy(ioutil.Discard, res.Body)
    res.Body.Close()
}

相關文章