dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
14.91k stars 4.64k forks source link

UdpClient set `ExclusiveAddressUse` fail #105056

Closed Coloryr closed 1 month ago

Coloryr commented 1 month ago

Description

System.InvalidOperationException
  HResult=0x80131509
  Message=The socket must not be bound or connected.
  Source=System.Net.Sockets
  StackTrace:
   在 System.Net.Sockets.Socket.set_ExclusiveAddressUse(Boolean value)

Reproduction Steps

_socketV4 = new(new IPEndPoint(IPAddress.Any, 4445))
{
    ExclusiveAddressUse = true,
};

Expected behavior

After setting the properties of the socket, it works normally.

Actual behavior

InvalidOperationException

Regression?

No response

Known Workarounds

Socket bind before create it.

_socketV4 = new()
{
    ExclusiveAddressUse = true,
};
_socketV4.Client.Bind(new IPEndPoint(IPAddress.Any, 4445));

Configuration

PS C:\Users\40206> dotnet --info
.NET SDK:
 Version:           8.0.303
 Commit:            29ab8e3268
 Workload version:  8.0.300-manifests.34944930
 MSBuild version:   17.10.4+10fbfbf2e

运行时环境:
 OS Name:     Windows
 OS Version:  10.0.22631
 OS Platform: Windows
 RID:         win-x64
 Base Path:   C:\Program Files\dotnet\sdk\8.0.303\

已安装 .NET 工作负载:
 [wasm-tools]
   安装源文件: VS 17.10.35027.167
   清单版本:    8.0.7/8.0.100
   清单路径:       C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.workload.mono.toolchain.current\8.0.7\WorkloadManifest.json
   安装类型:        FileBased

 [maccatalyst]
   安装源文件: VS 17.10.35027.167
   清单版本:    17.2.8053/8.0.100
   清单路径:       C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.maccatalyst\17.2.8053\WorkloadManifest.json
   安装类型:        FileBased

 [ios]
   安装源文件: VS 17.10.35027.167
   清单版本:    17.2.8053/8.0.100
   清单路径:       C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.ios\17.2.8053\WorkloadManifest.json
   安装类型:        FileBased

 [android]
   安装源文件: VS 17.10.35027.167
   清单版本:    34.0.95/8.0.100
   清单路径:       C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.android\34.0.95\WorkloadManifest.json
   安装类型:        FileBased

 [maui-windows]
   安装源文件: VS 17.10.35027.167
   清单版本:    8.0.61/8.0.100
   清单路径:       C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.maui\8.0.61\WorkloadManifest.json
   安装类型:        FileBased

 [aspire]
   安装源文件: VS 17.10.35027.167
   清单版本:    8.0.0/8.0.100
   清单路径:       C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.aspire\8.0.0\WorkloadManifest.json
   安装类型:        FileBased

Host:
  Version:      8.0.7
  Architecture: x64
  Commit:       2aade6beb0

.NET SDKs installed:
  8.0.203 [C:\Program Files\dotnet\sdk]
  8.0.303 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 6.0.32 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 7.0.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 8.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 8.0.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.16 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 6.0.32 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 7.0.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 8.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 8.0.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 6.0.32 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 7.0.7 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 8.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 8.0.7 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  x86   [C:\Program Files (x86)\dotnet]
    registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

Other information

I found UdpClient Bind to fast, so that the attribute cannot be set. https://github.com/dotnet/runtime/blob/513b503fe7ee58c4f602e2f60bf5a478995d4c84/src/libraries/System.Net.Sockets/src/System/Net/Sockets/UDPClient.cs#L83-L93

dotnet-policy-service[bot] commented 1 month ago

Tagging subscribers to this area: @dotnet/ncl See info in area-owners.md if you want to be subscribed.

antonfirsov commented 1 month ago

Instead of binding in the constructor, we could implement some sort of lazy mechanism for Bind in UdpClient, but I'm not sure it's worth the investment. In general, we advise users to use Socket directly instead of using UdpClient.

Triage: putting to Future tentatively, but we may close as wontfix. cc @wfurt