2015-11-05 2 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: адрес уже используется @Ggicci – user2986683

ответ

1

Если вы хотите, чтобы клиент использовать определенный номер локального порта, вы должны bind() после create(), но прежде чем вы connect(). Вы можете указать любой номер локального порта (и/или конкретный интерфейс) с помощью bind. не

Чтобы повторно использовать предыдущий номер порта, вы должны сделать этот номер порта, известного следующей попытки соединения и вы должны открыть его с SO_REUSEADDR"reuse" option каждый раз или второй привязки не будет допущен до первого полностью истекает (часто через 2 минуты после его закрытия).

Это имена функций C. У Go будет что-то подобное.

+0

Я знаю, но я просто не знаю, я знаю, как сделать то же самое в go orz – user2986683

Смежные вопросы