我现在写一个Socket的例子,想采用UDPR异步实现,但现在一直会出现一个异常,查了MSDN也找不到有用的信息,请高手指点下。
就是在我调用Socket类的Close()方法后,系统都会进入到接受信息的那个委托函数里面,然后引发一个异常,下面是那个方法: public void ReceiveComplete(IAsyncResult ar)
{
Socket mySocket = (Socket)ar.AsyncState;
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 0);
EndPoint remotePoint = (EndPoint)ipPoint;
int recvBytes=0;
string messageSend = "Hello,client!this is server!";
try
{
recvBytes = mySocket.EndReceiveFrom(ar, ref remotePoint);
_mySocket.SendMessage(SendComplete, messageSend, remotePoint);
}
catch (Exception)
{
}
string message = Encoding.Unicode.GetString(_buffer, 0, recvBytes);
//清空缓冲区
Array.Clear(_buffer, 0, _bufferSize);
try
{
mySocket.BeginReceiveFrom(_buffer, 0, _bufferSize, SocketFlags.None, ref remotePoint, ReceiveComplete, mySocket);
}
catch (Exception)
{
}
}也可能是这个方法写的有问题,总之,请高手指点吧,
就是在我调用Socket类的Close()方法后,系统都会进入到接受信息的那个委托函数里面,然后引发一个异常,下面是那个方法: public void ReceiveComplete(IAsyncResult ar)
{
Socket mySocket = (Socket)ar.AsyncState;
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 0);
EndPoint remotePoint = (EndPoint)ipPoint;
int recvBytes=0;
string messageSend = "Hello,client!this is server!";
try
{
recvBytes = mySocket.EndReceiveFrom(ar, ref remotePoint);
_mySocket.SendMessage(SendComplete, messageSend, remotePoint);
}
catch (Exception)
{
}
string message = Encoding.Unicode.GetString(_buffer, 0, recvBytes);
//清空缓冲区
Array.Clear(_buffer, 0, _bufferSize);
try
{
mySocket.BeginReceiveFrom(_buffer, 0, _bufferSize, SocketFlags.None, ref remotePoint, ReceiveComplete, mySocket);
}
catch (Exception)
{
}
}也可能是这个方法写的有问题,总之,请高手指点吧,
当socket关闭时BeginReceiveFrom会引发SocketException 异常。你捕捉一下这个异常然后判断异常代码。 sex.SocketErrorCode是什么。好像就是SocketError.Interrupted,如果等于这个你就做出相应处理就行了。
循环监听 BeginReceiveFrom(_buffer, 0, _bufferSize, SocketFlags.None, ref remotePoint, ReceiveComplete, mySocket);