我有以下問題的一個用法:C#.NET Socket連接問題 - 每個套接字地址通常允許
一旦我關閉我的WM6應用程序,然後嘗試再次啓動它,我得到這個錯誤: System.Net.Sockets.Socket.Bind(EndPoint localEP)通常只允許每個套接字地址(協議/網絡地址/端口)的一個用法: at System.Net.Sockets.Socket.TcpListener.Start() ...
我認爲這是由於連接超時的時間間隔,所以我會喜歡關閉所有打開的連接,並強制它創建一個新的連接,這是繼續進行的正確方式,還是有不同的方式來處理?
這裏是用來啓動監聽代碼:
/// <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());
}
}
}
關閉時關閉myTcpListener。 – 2013-03-13 15:43:31
我這樣做,但是我打電話給一些Dll,有時會導致應用程序崩潰,並且不會調用關機代碼。 – Astronaut 2013-03-13 15:50:06
您需要更好地處理該錯誤。只要崩潰並讓你的非託管資源擱置,你會得到這個錯誤。雖然CLR爲您管理託管對象的內存管理,但您需要爲非託管對象(如文件和網絡連接)執行此操作。 – 2013-03-13 16:16:20