
Se meu programa C usa soquetes, liga-se a localhost:9025
, troca alguns dados, é eliminado e reiniciado manualmente, às vezes ele trava com o erro sendo:
Endereço já em uso.
Todos os softwares recomendados pela SE com os quais tentei procurar “pid que usa port” não conseguiram retornar nenhum ID de processo, então presumo que não haja nenhum processo naquele momento que use port 9025
, o que deveria ser o caso.
No entanto, pelo que reuni a partir de comentários sobre questões semelhantes, pareceu-me que "Endereço" "já está em uso" se e somente se um processo usa esse endereço específico. Por que isso é falso então?
Agora presumo que o sistema operacional monitore quais endereços estão em uso e quais não estão, mas será esse o caso? Se for, adoraria que você me dissesse como faço para corrigir, pois minha melhor solução para esse problema é “esperar por um período de tempo indeterminado”.
EDITAR: eu uso Linux 5.2.2-arch1-1-ARCH x86_64
Responder1
Provavelmente você está reiniciando seu programa muito rápido ou o programa não está fechando o soquete.
Mesmo após o fechamento do soquete, 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 socket no programa com setockopt assim:
setsockopt(socket,SOL_SOCKET,SO_REUSEADDR ... )