异步Socket在关闭以后出错。
try{}catch{}捕获不了Socket.Close()异常,感觉因该是程序卸载内存时候出的错。
以下是异常内容:
未处理的“System.InvalidOperationException”类型的异常出现在 system.dll 中。
其他信息: AcceptCallback
多谢!
try{}catch{}捕获不了Socket.Close()异常,感觉因该是程序卸载内存时候出的错。
以下是异常内容:
未处理的“System.InvalidOperationException”类型的异常出现在 system.dll 中。
其他信息: AcceptCallback
多谢!
{
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,iPort);
try
{
sSocket.Bind(ipEndPoint);
sSocket.Listen(10);
}
catch
{
MessageBox.Show("网络服务启动失败");
return;
}
while(bRun == true)
{
tEvent.Reset();
sSocket.BeginAccept(new AsyncCallback(MessageFunc),sSocket);
tEvent.WaitOne();
Thread.Sleep(200);
}
eEvent.Set();
}
private void MessageFunc(IAsyncResult ar)
{
tEvent.Set();
Socket sSocket = (Socket)ar.AsyncState;
Socket cSocket = sSocket.EndAccept(ar);
byte[] sendBuffer = new byte[1024];
cSocket.Receive(sendBuffer);
string str = Encoding.Default.GetString(sendBuffer);
byte[] receiveBuffer = new byte[1024];
receiveBuffer = Encoding.Default.GetBytes("收到" + str);
cSocket.Send(receiveBuffer);
cSocket.Shutdown(SocketShutdown.Both);
cSocket.Close(); }
public void Stop()
{
bRun = false;
if(tEvent.WaitOne(1000,true) == false)
{
tEvent.Set();
}
eEvent.WaitOne();
tEvent.Close();
eEvent.Close();
sSocket.Close();
//成功结束后抛出异常
}
Accept之前一定要先Poll无论是同步还是异步,看看有没有请求的连接,如果有就Accept。如果没有Poll则Socket服务会一直阻塞监听,如果这时Close,就会抛出异常。
MSDN的实例几乎没有Socket服务的Close,所以没有用到Poll这个方法。
谢谢楼上的兄弟们了!