Uma porta é considerada "em uso" sempre que houver algum soquete associado a ela. Eles não precisam estar no estado LISTEN, apenas vinculados. Portanto, os soquetes TIME_WAIT que você vê contam.
Isso fica um pouco mais complicado se qualquer soquete estiver vinculado a endereços e portas. Soquetes diferentes podem ser ligados à mesma porta se estiverem vinculados a endereços diferentes. Mas se houver algum soquete vinculado ao endereço curinga ( INADDR_ANY
, mostrado por netstat
as *
) para essa porta, ele impedirá que outros soquetes se vinculem a qualquer endereço e a mesma porta .
Normalmente, a maioria dos softwares que usam soquetes de escuta define a opção SO_REUSEADDR
socket nesses soquetes. Esta opção relaxa as regras. Com a opção definida, somente um soquete de escuta e impede que outro soquete seja vinculado ao mesmo endereço. Isso significa que qualquer TIME_WAIT
remanescente e outros soquetes não impedirão que o software seja reiniciado e seja religado imediatamente à mesma porta.
Seu programa Java provavelmente não está configurando SO_REUSEADDR
em seu soquete, mas deveria.