Используйте netstat
, чтобы выяснить, в каком состоянии находится ваша конечная точка. Я предполагаю, что она находится в TIME_WAIT
и не полностью закрыта. Это правильное поведение для TCP, и оно существует, чтобы позволить прибывающим сегментам, которые могут все еще отсутствовать в эфире, поступать и не вызывать проблем. Длительность TIME_WAIT
примерно равна 2 * MSL, то есть вдвое превышает максимальное время жизни сегмента в сети, таким образом гарантируя, что даже сегмент, который получает повторную передачу, будет обработан должным образом.
Как уже отмечали другие, SO_REUSEADDR
ваш друг, если конечная точка дальней стороны каждый раз отличается. Это частый случай, но иногда люди делают странные вещи, такие как привязка клиента к определенному порту, и в этом случае вы все равно получите EADDRINUSE
b / c TCP, определяющий сеанс как оба конечные точки.