如何忽略异常
How to ignore exception
我正在使用 UDP 套接字发送然后接收消息。
所以当我收到时,我将超时异常设置为 4 秒...
sending_socket.ReceiveTimeout = 4000;
sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point);
现在我得到了这个异常(这是我所期待的): 'System.Net.Sockets.SocketException' 类型的未处理异常发生在 System.dll
附加信息:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应
我想知道如何忽略这个异常?
基本上我希望 UDPSOCKET 监听 4 秒,如果没有应答则尝试再次发送消息。我的代码如下(部分)
IPEndPoint sending_end_point = new IPEndPoint(sendto, sendPort);
EndPoint receiving_end_point = new IPEndPoint(IPAddress.Any, 0);
Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
text_to_send = ("hello");
byte[] send_buffer = Encoding.ASCII.GetBytes(text_to_send);
sending_socket.SendTo(send_buffer, sending_end_point);
Byte[] ByteFromListener = new byte[8000];
sending_socket.ReceiveTimeout = 4000;
sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point);
string datafromreceiver;
datafromreceiver = Encoding.ASCII.GetString(ByteFromListener).TrimEnd('[=11=]');
datafromreceiver = (datafromreceiver.ToString());
try
{
sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point);
}
catch (SocketException ex) { }
我建议您使用 sending_socket.Available
(Read on MSDN) 属性.
而不是检查异常
您可以添加一个逻辑来检查自发送数据以来经过的时间,然后如果 Available 尚未为真,则尝试再次发送。如下所示:
bool data_received = false;
do
{
DateTime dtSent;
sending_socket.SendTo(send_buffer, sending_end_point);
dtSent = DateTime.Now;
while(DateTime.Now - dtSent < TimeSpan.FromSeconds(4))
{
while(sending_socket.Available)
{
int bytes_available = sending_socket.Available;
// you can use bytes_available variable to create a buffer of the required size only.
//read data... and concatenate with previously received data, if required
data_received = true;
}
Thread.Sleep(100); // sleep for some time to let the data arrive
}
}while(!data_received);
以上代码只是一个简单的示例逻辑。请根据您的要求进行修改。
我强烈建议您不要依赖异常来处理您已经知道可能发生的情况。例外是为了处理那些事先无法知道的情况,以及没有机制检查的情况。
此外,SocketException
可能由于其他原因引发,例如端点不可用,连接因任何原因丢失。应该为这些场景处理异常,以便您的代码可以正确处理这些场景。
我正在使用 UDP 套接字发送然后接收消息。
所以当我收到时,我将超时异常设置为 4 秒...
sending_socket.ReceiveTimeout = 4000;
sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point);
现在我得到了这个异常(这是我所期待的): 'System.Net.Sockets.SocketException' 类型的未处理异常发生在 System.dll
附加信息:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应
我想知道如何忽略这个异常?
基本上我希望 UDPSOCKET 监听 4 秒,如果没有应答则尝试再次发送消息。我的代码如下(部分)
IPEndPoint sending_end_point = new IPEndPoint(sendto, sendPort);
EndPoint receiving_end_point = new IPEndPoint(IPAddress.Any, 0);
Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
text_to_send = ("hello");
byte[] send_buffer = Encoding.ASCII.GetBytes(text_to_send);
sending_socket.SendTo(send_buffer, sending_end_point);
Byte[] ByteFromListener = new byte[8000];
sending_socket.ReceiveTimeout = 4000;
sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point);
string datafromreceiver;
datafromreceiver = Encoding.ASCII.GetString(ByteFromListener).TrimEnd('[=11=]');
datafromreceiver = (datafromreceiver.ToString());
try
{
sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point);
}
catch (SocketException ex) { }
我建议您使用 sending_socket.Available
(Read on MSDN) 属性.
您可以添加一个逻辑来检查自发送数据以来经过的时间,然后如果 Available 尚未为真,则尝试再次发送。如下所示:
bool data_received = false;
do
{
DateTime dtSent;
sending_socket.SendTo(send_buffer, sending_end_point);
dtSent = DateTime.Now;
while(DateTime.Now - dtSent < TimeSpan.FromSeconds(4))
{
while(sending_socket.Available)
{
int bytes_available = sending_socket.Available;
// you can use bytes_available variable to create a buffer of the required size only.
//read data... and concatenate with previously received data, if required
data_received = true;
}
Thread.Sleep(100); // sleep for some time to let the data arrive
}
}while(!data_received);
以上代码只是一个简单的示例逻辑。请根据您的要求进行修改。
我强烈建议您不要依赖异常来处理您已经知道可能发生的情况。例外是为了处理那些事先无法知道的情况,以及没有机制检查的情况。
此外,SocketException
可能由于其他原因引发,例如端点不可用,连接因任何原因丢失。应该为这些场景处理异常,以便您的代码可以正确处理这些场景。