我已经看到很多关于在没有对象处理异常的情况下处理套接字的问题,所以我决定尝试一下,看看是否可以完成。这是我的发现。
问题?
您有一段代码使用 System.Net.Sockets 中的 Socket,它是一个服务器套接字。问题是您想关闭套接字,并且每次尝试都会收到 ObjectDisposedException。
您的代码可能如下所示:
private static ManualResetEvent allDone = new ManualResetEvent(false);
private Socket ear;
public void Start()
{
new Thread(() => StartListening()).Start();
}
private void StartListening()
{
IP = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First();
port = 11221;
IPEndPoint localEndPoint = new IPEndPoint(IP, Port);
ear = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ear.Bind(localEndPoint);
ear.Listen(100);
try
{
while (true)
{
allDone.Reset();
ear.BeginAccept(new AsyncCallback(AcceptCallback), ear);
allDone.WaitOne();
}
}
catch (ObjectDisposedException e)
{
Console.WriteLine("Socket Closed");
}
}
private void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
}
public static void ReadCallback(IAsyncResult ar)
{
String content = String.Empty;
StateObject state = (StateObject) ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0) {
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));
content = state.sb.ToString();
if (content.IndexOf("<EOF>") > -1) {
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", content.Length, content );
}
else
{
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
}
public void Stop()
{
ear.Close();
}
运行类似于上面的代码会在 AcceptCallback 试图结束接收时给你一个错误。即使您发现了这一点,您仍然会在 StartListening() 方法中遇到错误。