Mam następujący problem:C kwestia połączenia # .NET Socket - Tylko jedno użycie każdego adresu gniazda jest normalnie dozwolone
Gdy zamknę aplikację WM6, a następnie spróbuj uruchomić go ponownie i dostać ten błąd: Tylko jedno użycie każdego adresu gniazda (protokołu/adresu sieciowego/portu) jest zwykle dozwolone w System.Net.Sockets.Socket.Bind (EndPoint localEP) pod adresem System.Net.Sockets.Socket.TcpListener.Start() ...
Myślę, że jest to spowodowane interwałem czasu połączenia z limitem czasu, więc chciałbym jak zamknąć wszystkie otwarte połączenia i zmusić je do utworzenia nowego połączenia, czy jest to właściwy sposób postępowania, czy jest inny sposób poradzenia sobie z tym?
Oto kod używany aby rozpocząć odtwarzanie:
/// <summary>
/// Listens Asynchronously to Clients, creates a recieveMessageHandler to process the read.
///
/// Check WIKI, TODOS
/// </summary>
/// <returns></returns>
public void Listen()
{
myTcpListener.Start();
while (true)
{
//blocks until a client has connected to the server
try
{
TcpClient myTcpClient = myTcpListener.AcceptTcpClient();
DateTime now = DateTime.Now;
//Test if it's necessary to create a client
ClientConnection client = new ClientConnection(myTcpClient, new byte[myTcpClient.ReceiveBufferSize]);
// Capture the specific client and pass it to the receive handler
client.NetworkStream.BeginRead(client.Data, 0, myTcpClient.ReceiveBufferSize, r => receiveMessageHandler(r, client), null);
}
catch (Exception excp)
{
Debug.WriteLine(excp.ToString());
}
}
}
Podczas zamykania zamknij plik myTcpListener. –
Tak, ale nazywam niektóre biblioteki DLL, które czasami powodują awarię aplikacji, a kod zamknięcia nie jest wywoływany. – Astronaut
Musisz lepiej poradzić sobie z tym błędem. Po prostu rozbijając się i pozostawiając niezarządzane zasoby leżące wokół, pojawia się ten błąd. Mimo że CLR obsługuje zarządzanie pamięcią dla zarządzanych obiektów, należy to zrobić dla niezarządzanych obiektów, takich jak połączenia plików i sieci. –