Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误线程上的SocketException_C#_Multithreading_Udp_Udpclient_Socketexception - Fatal编程技术网

C# 错误线程上的SocketException

C# 错误线程上的SocketException,c#,multithreading,udp,udpclient,socketexception,C#,Multithreading,Udp,Udpclient,Socketexception,我正在使用C#UdpClient类进行UDP网络。有一个UdpClient对象绑定到固定的本地端口,但不绑定到任何远程端点,因为它需要能够向多个不同的端点发送/接收数据 我有两个线程:一个用于发送,一个用于接收。现在,当我将数据发送到存在的端点,但不侦听该端口时,我希望出现SocketException。我也有一个。不幸的是,返回异常的不是我的Send调用,而是Receive调用。因此,在我的发送线程上,我将数据发送到一个“无效”端点,而我的接收线程得到异常。不幸的是,在这一点上,我当然不知道是

我正在使用C#
UdpClient
类进行UDP网络。有一个
UdpClient
对象绑定到固定的本地端口,但不绑定到任何远程端点,因为它需要能够向多个不同的端点发送/接收数据

我有两个线程:一个用于发送,一个用于接收。现在,当我将数据发送到存在的端点,但不侦听该端口时,我希望出现
SocketException
。我也有一个。不幸的是,返回异常的不是我的
Send
调用,而是
Receive
调用。因此,在我的发送线程上,我将数据发送到一个“无效”端点,而我的接收线程得到异常。不幸的是,在这一点上,我当然不知道是什么端点导致了异常的发生

在发送之前存储端点,然后在接收线程中访问端点只是等待发生的竞争条件错误

不幸的是,
SocketException
没有提供导致错误的端点

有什么想法吗?是否有可能在发送线程上抛出异常


非常感谢您的帮助。

我认为这是UDP的预期行为。UDP
send()
不是阻塞操作,因此它不会等待潜在的错误。(更不用说,当发送到具有封闭端口的活动主机时,您无法可靠地接收错误消息,因为它可能会受到防火墙、速率限制或因拥塞等原因而丢弃。)

您可以
connect()
将UDP套接字连接到特定的远程端点,这将分配一个唯一的端口号,并允许操作系统[很可能]将该特定端点的错误与任何其他随机主机区分开来。但同样,您不应该依赖于处理这些错误的能力

很遗憾,异常中没有更多信息。这似乎是.NET处理UDP套接字方式的一个疏忽。根据,您需要检查异常的错误代码并适当地处理异常。(在您的情况下,这可能意味着忽略错误。)

当您
发送()UDP数据包时,它会在线路上消失。你不应该认为你会得到任何反馈

有时,如果目的地没有侦听器,则目的地可能会发送回
ICMP\u UNREACH\u端口
消息。介于两者之间的路由器可能会将该消息传递到您的操作系统。如果发生这种情况,则在原始的
send()
调用返回后很长时间。对于
ICMP\u Unrach\u端口
,操作系统通常会缓存该端口,并在下次执行
send()
到同一目标时报告错误。其他ICMP消息(您没有提到您遇到的异常情况)可能会影响其他呼叫


因此,底线是无法确定何时或是否会报告UDP错误。这取决于很多变量。因此,要准备好处理任何调用中的异常,并准备好数据包在不报告任何错误的情况下消失。

我认为这或多或少是出于设计,因为UDP是如何工作的。假设它可以发送数据,即正确初始化。我相信这是因为UDP不做任何错误检查。它只是简单地发送和忘记。如果它不杀死我的Receive()-调用,我可以接受它。不知何故,这似乎很不合逻辑。因此,读者更接近文档,可能是其他原因。你能发布SocketException和SocketException.ErrorCode来更好地帮助你吗。@Callash,逻辑是通常当你
send()
到一个远程主机,而你不知道远程主机是否在监听时,你是一个客户机,
recv()
调用是你期望看到错误的时候(由于UDP的异步性质)。听起来您正在开发一个服务器或点对点应用程序,这不太适合这个用例。在您的情况下,似乎您应该捕捉并忽略错误。