Você precisa vincular-se à opção de soquete SO_REUSEADDR para permite que a ligação subsequente seja bem-sucedida . No seu caso:
newsoap.bind_flags |= SO_REUSEADDR;
soap_bind(&newsoap, NULL, 13518, 100);
Meu programa liga uma porta para escutar, depois que ela termina, a porta não fica disponível por um momento e qualquer tentativa de abrir a mesma porta novamente para escutar falhará nesse período de tempo. Eu preciso esperar por um tempo para reabrir a porta.
Eu precisarei vincular repetidamente a porta, porque preciso testar novamente o programa do servidor repetidamente. Existe algum comando linux que possa liberar a porta prematuramente, ou qualquer código de programação para fazer a mesma coisa? Eu codifico em C ++ e uso o framework gSOAP.
Basicamente eu vou ligar a porta usando
soap_bind(&newsoap, NULL, 13518, 100);
que eu vinculo o servidor para escutar na porta 13518
.
Versão do Ubuntu: 11.10
Eu tentei o mesmo código no Windows, e a porta está imediatamente disponível após o término do programa. Preciso fazer algumas etapas extras no linux para desvincular a porta antes que ela termine?
Você precisa vincular-se à opção de soquete SO_REUSEADDR para permite que a ligação subsequente seja bem-sucedida . No seu caso:
newsoap.bind_flags |= SO_REUSEADDR;
soap_bind(&newsoap, NULL, 13518, 100);
Você precisa fechar o soquete. É um recurso de segurança, que uma porta aberta ficará bloqueada pelo kernel por algum tempo.
Eu não conheço o seu framework, você tem que olhar em seus documentos como fechar uma porta com ele. Eu usei apenas as chamadas diretas do kernel para usar as portas.
Você pode querer ler as páginas de manual de socket
bind
listen
e mais algumas das páginas mencionadas para realmente entender como isso funciona.