2015-11-05 118 views
1

使它短:
服務器(192.168.0.78)偵聽8013
客戶端(10.0.2.15)試圖連接服務器,獲取它的本地端口(eg.54591)如何重用撥打的TCP端口

如何使客戶端關閉連接並重用54591?
我試過找來:
1.關閉連接直接和收聽同一端口:不能重用端口
2.啓動其他程序的(B)來連接服務器並退出,然後試圖監聽端口B已使用:未知端口

是否有正確的方法來做到這一點?
代碼很簡單:
客戶

func main() {                              
    conn, err := net.Dial("tcp" , "192.168.0.78:8013")                   
    if err != nil {                            
     panic(err)                            
    }                                
    localAddr := conn.LocalAddr().String()                      
    conn.Close()                             
    // i got the local port, what to do?                       
    fmt.Println(localAddr)                          
}  

服務器

func main(){                              
    ln, err := net.Listen("tcp", ":8013")                       
    if err != nil {                            
     panic(err)                            
    }                                
    for i := 0; i < 5; i++ {                          
     conn, err := ln.Accept()                         
     if err != nil {                           
      panic(err)                           
     }                               
     fmt.Println(conn.RemoteAddr().String(), "connected")                  
     conn.Close()                            
    }                                
} 
+0

我已經測試你的代碼,但「直接關閉連接和監聽同一端口」是好的。沒有錯誤發生。 – Ggicci

+0

爲什麼?你在乎什麼客戶端口是什麼? – EJP

+0

我得到了這個:panic:listen tcp 10.0.2.15:54613:bind:address already already in use @Ggicci – user2986683

回答

1

如果你想有一個客戶端使用一個特定的本地端口號,則必須bind()後您connect()create()但在此之前。您可以使用bind指定任何本地端口號(和/或特定接口)。

要重新使用以前的端口號,你必須要知道下一個連接嘗試該端口號和你必須與SO_REUSEADDR"reuse" option每一次或第二次綁定打開它不會被允許,直到第一個完全到期(通常在關閉後2分鐘)。

這些是C函數名稱。 Go會有類似的東西。

+0

我知道,但我只是不願意'我知道如何在go orz中做同樣的事情 – user2986683