Se meu programa C usa soquetes, liga-se a localhost:9025
, troca alguns dados, é morto e reiniciado manualmente, às vezes ele trava com o erro sendo:
Endereço já em uso.
Todos os softwares recomendados pelo SE com os quais tentei procurar por “pid que usa porta” falharam em retornar qualquer id de processo, então presumo que não haja nenhum processo naquele momento que use port 9025
, o que deve ser o caso.
No entanto, pelo que reuni a partir de comentários sobre questões topicamente semelhantes, pareceu-me que "Endereço" já está "em uso" se e somente se um processo usar esse endereço específico. Por que isso é falso então?
Agora, suponho que o sistema operacional rastreie quais endereços estão em uso e quais não estão, mas é esse o caso? Se for, adoraria que você pudesse me dizer como faço para corrigir isso, porque minha melhor solução para esse problema é “esperar por um período de tempo indeterminado”.
EDIT: Eu uso Linux 5.2.2-arch1-1-ARCH x86_64
Você provavelmente está reiniciando seu programa muito rápido ou o programa não está fechando o soquete.
Mesmo após o soquete ser fechado, o Linux mantém a conexão no limbo por algum tempo, mas impedirá que qualquer outra conexão seja aceita para o mesmo quádruplo de "endereço de origem, porta de origem, endereço de destino, porta de destino".
A solução é definir a opção de soquete no programa com setsockopt assim: