Pergunta

Eu tenho um loop que abre um socket, age sobre o soquete, em seguida, fecha o soquete e reiniciado. No entanto, na segunda iteração eu recebo SocketException, apenas uma utilização de cada endereço de soquete (protocolo / endereço de rede / porta) normalmente é permitida.
No entanto, o soquete deve ser fechado, netstat -a não mostrar que eu estou escutando nessa porta ou qualquer coisa. O código que gera a exceção é:

_bindedLocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_bindedLocalSocket.Bind(new IPEndPoint(Util.ChannelProfileToListeningAddress(_profile), _profile.ListenPort));
_bindedLocalSocket.Listen(30);
_bindedLocalSocket.BeginAccept(new AsyncCallback(OnRequested), null);

No entanto, acho que o culpado não é que o código, pouco antes de eu chegar a esse código, e antes de eu tentar fechar a conexão fico com esta:

An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
   at Poderosa.PortForwarding.SynchronizedSocket.EndReceive(IAsyncResult ar)
   at Poderosa.PortForwarding.Channel.OnSocketData(IAsyncResult result)

Uma vez que eu fechar o programa e executá-lo novamente, ele pode fazer a primeira multa conexão, o segundo age exatamente o mesmo (SocketException). Alguém tem alguma idéia de como posso resolver isso?

Foi útil?

Solução

Eu pensei que socket.Close () cuidou disso, mas eu não acho. Nesse caso, você precisará usar:

socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

Você pode ler mais sobre opções de socket aqui .

Outras dicas

É um problema conhecido no Windows, que, mesmo se você fechou uma tomada, há um waittime antes que o recurso é liberado de volta para o sistema operacional.

Existe uma maneira de definir manualmente o waittime para uma tomada em .NET, no entanto, pode ser uma opção melhor para revisitar o seu design, em vez disso manter o soquete de escuta aberta, em vez de fechá-lo para baixo, e, em vez perto do novo soquete que é criado durante Socket.Accept ();

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top