add ReceiveFromAsync and SendToAsync with SocketAddress overload - #90086

Merged
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync
Aug 8, 2023
Merged

add ReceiveFromAsync and SendToAsync with SocketAddress overload#90086
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync

Conversation

@wfurt

@wfurtwfurt commented Aug 7, 2023

Copy link
Copy Markdown
Member

contributes to #30797
fixes#87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

also fixes#78448

@wfurtwfurt added this to the 8.0.0 milestone Aug 7, 2023
@wfurt
wfurt requested a review from stephentoubAugust 7, 2023 04:01
@wfurtwfurt self-assigned this Aug 7, 2023
@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

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

Issue Details

contributes to #30797
fixes #87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Sockets

Milestone:8.0.0

@stephentoub

Copy link
Copy Markdown
Member

contributes to #30797

What's more to do on that issue?

@stephentoubstephentoub left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share perf numbers?

Comment threadsrc/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs Outdated
Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
endPoint.Address.TryWriteBytes(addressBuffer2, out _);
return endPoint.Address.ScopeId == (long)scopeid && addressBuffer1.SequenceEqual(addressBuffer2);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we compare the scope id before doing the TryWriteBytes above?

Comment threadsrc/libraries/Common/src/System/Net/SocketAddress.cs Outdated
Comment threadsrc/libraries/Common/src/System/Net/SocketAddressExtensions.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs Outdated
public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, SocketAddress receivedAddress)
{
ThrowIfDisposed();
ArgumentNullException.ThrowIfNull(receivedAddress, nameof(receivedAddress));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ensure we have tests for all argument validation across all the new methods.

@wfurt

wfurt commented Aug 7, 2023

Copy link
Copy Markdown
MemberAuthor

contributes to #30797

What's more to do on that issue?

nothing for 8.0. Plan to write some summary there and either keep it if we want to expose it on EventArg for consistency, open separate issue for it or close it with comment and wait if there is need for it.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor

This should be ready for another review round @stephentoub
I also added tests and fixes for #78448 since that is the same area.
I'll get perf comparison today

IntPtr socket = INVALID_SOCKET;
try
{
socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT);

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke Socket.OSSupportsUnixDomainSockets as Windows only support Stream for UDS.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor
MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDGen0AllocatedAlloc Ratio
ConnectAcceptAsyncJob-ZDTGEN\PR\corerun.exe761.8 us315.49 us363.32 us513.1 us471.6 us1,547.8 us1.490.75-1344 B1.00
ConnectAcceptAsyncJob-VRCVXQ\main\corerun.exe502.9 us15.49 us15.90 us509.7 us481.3 us522.3 us1.000.00-1345 B1.00
SendAsyncThenReceiveAsync_TaskJob-ZDTGEN\PR\corerun.exe104,494.1 us2,054.93 us2,018.22 us104,477.0 us100,835.1 us108,956.7 us1.000.04--NA
SendAsyncThenReceiveAsync_TaskJob-VRCVXQ\main\corerun.exe104,136.5 us3,092.13 us3,436.90 us102,974.0 us99,681.8 us112,911.4 us1.000.00--NA
ReceiveAsyncThenSendAsync_TaskJob-ZDTGEN\PR\corerun.exe685,473.6 us13,392.59 us14,329.93 us682,778.8 us660,879.8 us712,324.7 us0.960.15--NA
ReceiveAsyncThenSendAsync_TaskJob-VRCVXQ\main\corerun.exe728,471.7 us78,202.80 us90,058.46 us713,186.3 us510,999.9 us885,721.3 us1.000.00--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe102,279.1 us1,540.97 us1,366.03 us102,311.2 us100,069.7 us104,280.6 us0.960.05--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe104,810.3 us4,388.80 us5,054.15 us102,546.4 us98,808.3 us113,480.5 us1.000.00--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe674,034.8 us44,428.74 us47,538.26 us684,631.1 us486,587.7 us698,983.0 us0.940.08--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe719,407.7 us29,227.37 us33,658.29 us702,072.3 us683,461.1 us782,602.0 us1.000.00--NA
ReceiveFromAsyncThenSendToAsync_TaskJob-ZDTGEN\PR\corerun.exe1,587,406.7 us73,418.09 us84,548.38 us1,585,315.7 us1,407,020.1 us1,751,406.0 us0.990.08-4321064 B0.75
ReceiveFromAsyncThenSendToAsync_TaskJob-VRCVXQ\main\corerun.exe1,610,837.5 us96,790.05 us103,564.27 us1,616,955.2 us1,373,973.8 us1,811,356.2 us1.000.00-5761064 B1.00
SendToThenReceiveFromJob-ZDTGEN\PR\corerun.exe164,729.9 us1,880.36 us1,758.89 us164,669.6 us162,245.6 us168,004.6 us0.980.02500.00004320440 B0.75
SendToThenReceiveFromJob-VRCVXQ\main\corerun.exe168,548.9 us3,004.79 us2,810.68 us167,155.2 us164,936.9 us173,277.2 us1.000.00-5761408 B1.00

shows ~ 25% allocation reduction in legacy SendTo/ReceiveFrom. We can still probably do better - tabling for 9.0

@wfurt
wfurt merged commit 17d13fa into dotnet:mainAug 8, 2023
@wfurt
wfurt deleted the receiveFromAsync branch August 8, 2023 23:23
@ghostghost locked as resolved and limited conversation to collaborators Sep 8, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: add overloads with SocketAddress to Socket's SendTo and ReceiveFrom Debug.Assert when using ReceiveFrom on UnixDomainSocket

2 participants

@wfurt@stephentoub
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

add ReceiveFromAsync and SendToAsync with SocketAddress overload - #90086

Merged
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync
Aug 8, 2023
Merged

add ReceiveFromAsync and SendToAsync with SocketAddress overload#90086
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync

Conversation

@wfurt

@wfurtwfurt commented Aug 7, 2023

Copy link
Copy Markdown
Member

contributes to #30797
fixes#87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

also fixes#78448

@wfurtwfurt added this to the 8.0.0 milestone Aug 7, 2023
@wfurt
wfurt requested a review from stephentoubAugust 7, 2023 04:01
@wfurtwfurt self-assigned this Aug 7, 2023
@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

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

Issue Details

contributes to #30797
fixes #87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Sockets

Milestone:8.0.0

@stephentoub

Copy link
Copy Markdown
Member

contributes to #30797

What's more to do on that issue?

@stephentoubstephentoub left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share perf numbers?

Comment threadsrc/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs Outdated
Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
endPoint.Address.TryWriteBytes(addressBuffer2, out _);
return endPoint.Address.ScopeId == (long)scopeid && addressBuffer1.SequenceEqual(addressBuffer2);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we compare the scope id before doing the TryWriteBytes above?

Comment threadsrc/libraries/Common/src/System/Net/SocketAddress.cs Outdated
Comment threadsrc/libraries/Common/src/System/Net/SocketAddressExtensions.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs Outdated
public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, SocketAddress receivedAddress)
{
ThrowIfDisposed();
ArgumentNullException.ThrowIfNull(receivedAddress, nameof(receivedAddress));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ensure we have tests for all argument validation across all the new methods.

@wfurt

wfurt commented Aug 7, 2023

Copy link
Copy Markdown
MemberAuthor

contributes to #30797

What's more to do on that issue?

nothing for 8.0. Plan to write some summary there and either keep it if we want to expose it on EventArg for consistency, open separate issue for it or close it with comment and wait if there is need for it.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor

This should be ready for another review round @stephentoub
I also added tests and fixes for #78448 since that is the same area.
I'll get perf comparison today

IntPtr socket = INVALID_SOCKET;
try
{
socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT);

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke Socket.OSSupportsUnixDomainSockets as Windows only support Stream for UDS.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor
MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDGen0AllocatedAlloc Ratio
ConnectAcceptAsyncJob-ZDTGEN\PR\corerun.exe761.8 us315.49 us363.32 us513.1 us471.6 us1,547.8 us1.490.75-1344 B1.00
ConnectAcceptAsyncJob-VRCVXQ\main\corerun.exe502.9 us15.49 us15.90 us509.7 us481.3 us522.3 us1.000.00-1345 B1.00
SendAsyncThenReceiveAsync_TaskJob-ZDTGEN\PR\corerun.exe104,494.1 us2,054.93 us2,018.22 us104,477.0 us100,835.1 us108,956.7 us1.000.04--NA
SendAsyncThenReceiveAsync_TaskJob-VRCVXQ\main\corerun.exe104,136.5 us3,092.13 us3,436.90 us102,974.0 us99,681.8 us112,911.4 us1.000.00--NA
ReceiveAsyncThenSendAsync_TaskJob-ZDTGEN\PR\corerun.exe685,473.6 us13,392.59 us14,329.93 us682,778.8 us660,879.8 us712,324.7 us0.960.15--NA
ReceiveAsyncThenSendAsync_TaskJob-VRCVXQ\main\corerun.exe728,471.7 us78,202.80 us90,058.46 us713,186.3 us510,999.9 us885,721.3 us1.000.00--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe102,279.1 us1,540.97 us1,366.03 us102,311.2 us100,069.7 us104,280.6 us0.960.05--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe104,810.3 us4,388.80 us5,054.15 us102,546.4 us98,808.3 us113,480.5 us1.000.00--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe674,034.8 us44,428.74 us47,538.26 us684,631.1 us486,587.7 us698,983.0 us0.940.08--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe719,407.7 us29,227.37 us33,658.29 us702,072.3 us683,461.1 us782,602.0 us1.000.00--NA
ReceiveFromAsyncThenSendToAsync_TaskJob-ZDTGEN\PR\corerun.exe1,587,406.7 us73,418.09 us84,548.38 us1,585,315.7 us1,407,020.1 us1,751,406.0 us0.990.08-4321064 B0.75
ReceiveFromAsyncThenSendToAsync_TaskJob-VRCVXQ\main\corerun.exe1,610,837.5 us96,790.05 us103,564.27 us1,616,955.2 us1,373,973.8 us1,811,356.2 us1.000.00-5761064 B1.00
SendToThenReceiveFromJob-ZDTGEN\PR\corerun.exe164,729.9 us1,880.36 us1,758.89 us164,669.6 us162,245.6 us168,004.6 us0.980.02500.00004320440 B0.75
SendToThenReceiveFromJob-VRCVXQ\main\corerun.exe168,548.9 us3,004.79 us2,810.68 us167,155.2 us164,936.9 us173,277.2 us1.000.00-5761408 B1.00

shows ~ 25% allocation reduction in legacy SendTo/ReceiveFrom. We can still probably do better - tabling for 9.0

@wfurt
wfurt merged commit 17d13fa into dotnet:mainAug 8, 2023
@wfurt
wfurt deleted the receiveFromAsync branch August 8, 2023 23:23
@ghostghost locked as resolved and limited conversation to collaborators Sep 8, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: add overloads with SocketAddress to Socket's SendTo and ReceiveFrom Debug.Assert when using ReceiveFrom on UnixDomainSocket

2 participants

@wfurt@stephentoub
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

add ReceiveFromAsync and SendToAsync with SocketAddress overload - #90086

Merged
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync
Aug 8, 2023
Merged

add ReceiveFromAsync and SendToAsync with SocketAddress overload#90086
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync

Conversation

@wfurt

@wfurtwfurt commented Aug 7, 2023

Copy link
Copy Markdown
Member

contributes to #30797
fixes#87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

also fixes#78448

@wfurtwfurt added this to the 8.0.0 milestone Aug 7, 2023
@wfurt
wfurt requested a review from stephentoubAugust 7, 2023 04:01
@wfurtwfurt self-assigned this Aug 7, 2023
@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

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

Issue Details

contributes to #30797
fixes #87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Sockets

Milestone:8.0.0

@stephentoub

Copy link
Copy Markdown
Member

contributes to #30797

What's more to do on that issue?

@stephentoubstephentoub left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share perf numbers?

Comment threadsrc/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs Outdated
Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
endPoint.Address.TryWriteBytes(addressBuffer2, out _);
return endPoint.Address.ScopeId == (long)scopeid && addressBuffer1.SequenceEqual(addressBuffer2);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we compare the scope id before doing the TryWriteBytes above?

Comment threadsrc/libraries/Common/src/System/Net/SocketAddress.cs Outdated
Comment threadsrc/libraries/Common/src/System/Net/SocketAddressExtensions.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs Outdated
public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, SocketAddress receivedAddress)
{
ThrowIfDisposed();
ArgumentNullException.ThrowIfNull(receivedAddress, nameof(receivedAddress));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ensure we have tests for all argument validation across all the new methods.

@wfurt

wfurt commented Aug 7, 2023

Copy link
Copy Markdown
MemberAuthor

contributes to #30797

What's more to do on that issue?

nothing for 8.0. Plan to write some summary there and either keep it if we want to expose it on EventArg for consistency, open separate issue for it or close it with comment and wait if there is need for it.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor

This should be ready for another review round @stephentoub
I also added tests and fixes for #78448 since that is the same area.
I'll get perf comparison today

IntPtr socket = INVALID_SOCKET;
try
{
socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT);

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke Socket.OSSupportsUnixDomainSockets as Windows only support Stream for UDS.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor
MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDGen0AllocatedAlloc Ratio
ConnectAcceptAsyncJob-ZDTGEN\PR\corerun.exe761.8 us315.49 us363.32 us513.1 us471.6 us1,547.8 us1.490.75-1344 B1.00
ConnectAcceptAsyncJob-VRCVXQ\main\corerun.exe502.9 us15.49 us15.90 us509.7 us481.3 us522.3 us1.000.00-1345 B1.00
SendAsyncThenReceiveAsync_TaskJob-ZDTGEN\PR\corerun.exe104,494.1 us2,054.93 us2,018.22 us104,477.0 us100,835.1 us108,956.7 us1.000.04--NA
SendAsyncThenReceiveAsync_TaskJob-VRCVXQ\main\corerun.exe104,136.5 us3,092.13 us3,436.90 us102,974.0 us99,681.8 us112,911.4 us1.000.00--NA
ReceiveAsyncThenSendAsync_TaskJob-ZDTGEN\PR\corerun.exe685,473.6 us13,392.59 us14,329.93 us682,778.8 us660,879.8 us712,324.7 us0.960.15--NA
ReceiveAsyncThenSendAsync_TaskJob-VRCVXQ\main\corerun.exe728,471.7 us78,202.80 us90,058.46 us713,186.3 us510,999.9 us885,721.3 us1.000.00--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe102,279.1 us1,540.97 us1,366.03 us102,311.2 us100,069.7 us104,280.6 us0.960.05--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe104,810.3 us4,388.80 us5,054.15 us102,546.4 us98,808.3 us113,480.5 us1.000.00--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe674,034.8 us44,428.74 us47,538.26 us684,631.1 us486,587.7 us698,983.0 us0.940.08--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe719,407.7 us29,227.37 us33,658.29 us702,072.3 us683,461.1 us782,602.0 us1.000.00--NA
ReceiveFromAsyncThenSendToAsync_TaskJob-ZDTGEN\PR\corerun.exe1,587,406.7 us73,418.09 us84,548.38 us1,585,315.7 us1,407,020.1 us1,751,406.0 us0.990.08-4321064 B0.75
ReceiveFromAsyncThenSendToAsync_TaskJob-VRCVXQ\main\corerun.exe1,610,837.5 us96,790.05 us103,564.27 us1,616,955.2 us1,373,973.8 us1,811,356.2 us1.000.00-5761064 B1.00
SendToThenReceiveFromJob-ZDTGEN\PR\corerun.exe164,729.9 us1,880.36 us1,758.89 us164,669.6 us162,245.6 us168,004.6 us0.980.02500.00004320440 B0.75
SendToThenReceiveFromJob-VRCVXQ\main\corerun.exe168,548.9 us3,004.79 us2,810.68 us167,155.2 us164,936.9 us173,277.2 us1.000.00-5761408 B1.00

shows ~ 25% allocation reduction in legacy SendTo/ReceiveFrom. We can still probably do better - tabling for 9.0

@wfurt
wfurt merged commit 17d13fa into dotnet:mainAug 8, 2023
@wfurt
wfurt deleted the receiveFromAsync branch August 8, 2023 23:23
@ghostghost locked as resolved and limited conversation to collaborators Sep 8, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: add overloads with SocketAddress to Socket's SendTo and ReceiveFrom Debug.Assert when using ReceiveFrom on UnixDomainSocket

2 participants

@wfurt@stephentoub
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

add ReceiveFromAsync and SendToAsync with SocketAddress overload - #90086

Merged
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync
Aug 8, 2023
Merged

add ReceiveFromAsync and SendToAsync with SocketAddress overload#90086
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync

Conversation

@wfurt

@wfurtwfurt commented Aug 7, 2023

Copy link
Copy Markdown
Member

contributes to #30797
fixes#87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

also fixes#78448

@wfurtwfurt added this to the 8.0.0 milestone Aug 7, 2023
@wfurt
wfurt requested a review from stephentoubAugust 7, 2023 04:01
@wfurtwfurt self-assigned this Aug 7, 2023
@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

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

Issue Details

contributes to #30797
fixes #87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Sockets

Milestone:8.0.0

@stephentoub

Copy link
Copy Markdown
Member

contributes to #30797

What's more to do on that issue?

@stephentoubstephentoub left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share perf numbers?

Comment threadsrc/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs Outdated
Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
endPoint.Address.TryWriteBytes(addressBuffer2, out _);
return endPoint.Address.ScopeId == (long)scopeid && addressBuffer1.SequenceEqual(addressBuffer2);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we compare the scope id before doing the TryWriteBytes above?

Comment threadsrc/libraries/Common/src/System/Net/SocketAddress.cs Outdated
Comment threadsrc/libraries/Common/src/System/Net/SocketAddressExtensions.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs Outdated
public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, SocketAddress receivedAddress)
{
ThrowIfDisposed();
ArgumentNullException.ThrowIfNull(receivedAddress, nameof(receivedAddress));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ensure we have tests for all argument validation across all the new methods.

@wfurt

wfurt commented Aug 7, 2023

Copy link
Copy Markdown
MemberAuthor

contributes to #30797

What's more to do on that issue?

nothing for 8.0. Plan to write some summary there and either keep it if we want to expose it on EventArg for consistency, open separate issue for it or close it with comment and wait if there is need for it.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor

This should be ready for another review round @stephentoub
I also added tests and fixes for #78448 since that is the same area.
I'll get perf comparison today

IntPtr socket = INVALID_SOCKET;
try
{
socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT);

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke Socket.OSSupportsUnixDomainSockets as Windows only support Stream for UDS.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor
MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDGen0AllocatedAlloc Ratio
ConnectAcceptAsyncJob-ZDTGEN\PR\corerun.exe761.8 us315.49 us363.32 us513.1 us471.6 us1,547.8 us1.490.75-1344 B1.00
ConnectAcceptAsyncJob-VRCVXQ\main\corerun.exe502.9 us15.49 us15.90 us509.7 us481.3 us522.3 us1.000.00-1345 B1.00
SendAsyncThenReceiveAsync_TaskJob-ZDTGEN\PR\corerun.exe104,494.1 us2,054.93 us2,018.22 us104,477.0 us100,835.1 us108,956.7 us1.000.04--NA
SendAsyncThenReceiveAsync_TaskJob-VRCVXQ\main\corerun.exe104,136.5 us3,092.13 us3,436.90 us102,974.0 us99,681.8 us112,911.4 us1.000.00--NA
ReceiveAsyncThenSendAsync_TaskJob-ZDTGEN\PR\corerun.exe685,473.6 us13,392.59 us14,329.93 us682,778.8 us660,879.8 us712,324.7 us0.960.15--NA
ReceiveAsyncThenSendAsync_TaskJob-VRCVXQ\main\corerun.exe728,471.7 us78,202.80 us90,058.46 us713,186.3 us510,999.9 us885,721.3 us1.000.00--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe102,279.1 us1,540.97 us1,366.03 us102,311.2 us100,069.7 us104,280.6 us0.960.05--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe104,810.3 us4,388.80 us5,054.15 us102,546.4 us98,808.3 us113,480.5 us1.000.00--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe674,034.8 us44,428.74 us47,538.26 us684,631.1 us486,587.7 us698,983.0 us0.940.08--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe719,407.7 us29,227.37 us33,658.29 us702,072.3 us683,461.1 us782,602.0 us1.000.00--NA
ReceiveFromAsyncThenSendToAsync_TaskJob-ZDTGEN\PR\corerun.exe1,587,406.7 us73,418.09 us84,548.38 us1,585,315.7 us1,407,020.1 us1,751,406.0 us0.990.08-4321064 B0.75
ReceiveFromAsyncThenSendToAsync_TaskJob-VRCVXQ\main\corerun.exe1,610,837.5 us96,790.05 us103,564.27 us1,616,955.2 us1,373,973.8 us1,811,356.2 us1.000.00-5761064 B1.00
SendToThenReceiveFromJob-ZDTGEN\PR\corerun.exe164,729.9 us1,880.36 us1,758.89 us164,669.6 us162,245.6 us168,004.6 us0.980.02500.00004320440 B0.75
SendToThenReceiveFromJob-VRCVXQ\main\corerun.exe168,548.9 us3,004.79 us2,810.68 us167,155.2 us164,936.9 us173,277.2 us1.000.00-5761408 B1.00

shows ~ 25% allocation reduction in legacy SendTo/ReceiveFrom. We can still probably do better - tabling for 9.0

@wfurt
wfurt merged commit 17d13fa into dotnet:mainAug 8, 2023
@wfurt
wfurt deleted the receiveFromAsync branch August 8, 2023 23:23
@ghostghost locked as resolved and limited conversation to collaborators Sep 8, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: add overloads with SocketAddress to Socket's SendTo and ReceiveFrom Debug.Assert when using ReceiveFrom on UnixDomainSocket

2 participants

@wfurt@stephentoub
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

add ReceiveFromAsync and SendToAsync with SocketAddress overload - #90086

Merged
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync
Aug 8, 2023
Merged

add ReceiveFromAsync and SendToAsync with SocketAddress overload#90086
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync

Conversation

@wfurt

@wfurtwfurt commented Aug 7, 2023

Copy link
Copy Markdown
Member

contributes to #30797
fixes#87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

also fixes#78448

@wfurtwfurt added this to the 8.0.0 milestone Aug 7, 2023
@wfurt
wfurt requested a review from stephentoubAugust 7, 2023 04:01
@wfurtwfurt self-assigned this Aug 7, 2023
@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

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

Issue Details

contributes to #30797
fixes #87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Sockets

Milestone:8.0.0

@stephentoub

Copy link
Copy Markdown
Member

contributes to #30797

What's more to do on that issue?

@stephentoubstephentoub left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share perf numbers?

Comment threadsrc/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs Outdated
Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
endPoint.Address.TryWriteBytes(addressBuffer2, out _);
return endPoint.Address.ScopeId == (long)scopeid && addressBuffer1.SequenceEqual(addressBuffer2);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we compare the scope id before doing the TryWriteBytes above?

Comment threadsrc/libraries/Common/src/System/Net/SocketAddress.cs Outdated
Comment threadsrc/libraries/Common/src/System/Net/SocketAddressExtensions.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs Outdated
public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, SocketAddress receivedAddress)
{
ThrowIfDisposed();
ArgumentNullException.ThrowIfNull(receivedAddress, nameof(receivedAddress));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ensure we have tests for all argument validation across all the new methods.

@wfurt

wfurt commented Aug 7, 2023

Copy link
Copy Markdown
MemberAuthor

contributes to #30797

What's more to do on that issue?

nothing for 8.0. Plan to write some summary there and either keep it if we want to expose it on EventArg for consistency, open separate issue for it or close it with comment and wait if there is need for it.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor

This should be ready for another review round @stephentoub
I also added tests and fixes for #78448 since that is the same area.
I'll get perf comparison today

IntPtr socket = INVALID_SOCKET;
try
{
socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT);

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke Socket.OSSupportsUnixDomainSockets as Windows only support Stream for UDS.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor
MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDGen0AllocatedAlloc Ratio
ConnectAcceptAsyncJob-ZDTGEN\PR\corerun.exe761.8 us315.49 us363.32 us513.1 us471.6 us1,547.8 us1.490.75-1344 B1.00
ConnectAcceptAsyncJob-VRCVXQ\main\corerun.exe502.9 us15.49 us15.90 us509.7 us481.3 us522.3 us1.000.00-1345 B1.00
SendAsyncThenReceiveAsync_TaskJob-ZDTGEN\PR\corerun.exe104,494.1 us2,054.93 us2,018.22 us104,477.0 us100,835.1 us108,956.7 us1.000.04--NA
SendAsyncThenReceiveAsync_TaskJob-VRCVXQ\main\corerun.exe104,136.5 us3,092.13 us3,436.90 us102,974.0 us99,681.8 us112,911.4 us1.000.00--NA
ReceiveAsyncThenSendAsync_TaskJob-ZDTGEN\PR\corerun.exe685,473.6 us13,392.59 us14,329.93 us682,778.8 us660,879.8 us712,324.7 us0.960.15--NA
ReceiveAsyncThenSendAsync_TaskJob-VRCVXQ\main\corerun.exe728,471.7 us78,202.80 us90,058.46 us713,186.3 us510,999.9 us885,721.3 us1.000.00--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe102,279.1 us1,540.97 us1,366.03 us102,311.2 us100,069.7 us104,280.6 us0.960.05--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe104,810.3 us4,388.80 us5,054.15 us102,546.4 us98,808.3 us113,480.5 us1.000.00--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe674,034.8 us44,428.74 us47,538.26 us684,631.1 us486,587.7 us698,983.0 us0.940.08--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe719,407.7 us29,227.37 us33,658.29 us702,072.3 us683,461.1 us782,602.0 us1.000.00--NA
ReceiveFromAsyncThenSendToAsync_TaskJob-ZDTGEN\PR\corerun.exe1,587,406.7 us73,418.09 us84,548.38 us1,585,315.7 us1,407,020.1 us1,751,406.0 us0.990.08-4321064 B0.75
ReceiveFromAsyncThenSendToAsync_TaskJob-VRCVXQ\main\corerun.exe1,610,837.5 us96,790.05 us103,564.27 us1,616,955.2 us1,373,973.8 us1,811,356.2 us1.000.00-5761064 B1.00
SendToThenReceiveFromJob-ZDTGEN\PR\corerun.exe164,729.9 us1,880.36 us1,758.89 us164,669.6 us162,245.6 us168,004.6 us0.980.02500.00004320440 B0.75
SendToThenReceiveFromJob-VRCVXQ\main\corerun.exe168,548.9 us3,004.79 us2,810.68 us167,155.2 us164,936.9 us173,277.2 us1.000.00-5761408 B1.00

shows ~ 25% allocation reduction in legacy SendTo/ReceiveFrom. We can still probably do better - tabling for 9.0

@wfurt
wfurt merged commit 17d13fa into dotnet:mainAug 8, 2023
@wfurt
wfurt deleted the receiveFromAsync branch August 8, 2023 23:23
@ghostghost locked as resolved and limited conversation to collaborators Sep 8, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: add overloads with SocketAddress to Socket's SendTo and ReceiveFrom Debug.Assert when using ReceiveFrom on UnixDomainSocket

2 participants

@wfurt@stephentoub
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

add ReceiveFromAsync and SendToAsync with SocketAddress overload - #90086

Merged
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync
Aug 8, 2023
Merged

add ReceiveFromAsync and SendToAsync with SocketAddress overload#90086
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync

Conversation

@wfurt

@wfurtwfurt commented Aug 7, 2023

Copy link
Copy Markdown
Member

contributes to #30797
fixes#87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

also fixes#78448

@wfurtwfurt added this to the 8.0.0 milestone Aug 7, 2023
@wfurt
wfurt requested a review from stephentoubAugust 7, 2023 04:01
@wfurtwfurt self-assigned this Aug 7, 2023
@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

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

Issue Details

contributes to #30797
fixes #87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Sockets

Milestone:8.0.0

@stephentoub

Copy link
Copy Markdown
Member

contributes to #30797

What's more to do on that issue?

@stephentoubstephentoub left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share perf numbers?

Comment threadsrc/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs Outdated
Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
endPoint.Address.TryWriteBytes(addressBuffer2, out _);
return endPoint.Address.ScopeId == (long)scopeid && addressBuffer1.SequenceEqual(addressBuffer2);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we compare the scope id before doing the TryWriteBytes above?

Comment threadsrc/libraries/Common/src/System/Net/SocketAddress.cs Outdated
Comment threadsrc/libraries/Common/src/System/Net/SocketAddressExtensions.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs Outdated
public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, SocketAddress receivedAddress)
{
ThrowIfDisposed();
ArgumentNullException.ThrowIfNull(receivedAddress, nameof(receivedAddress));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ensure we have tests for all argument validation across all the new methods.

@wfurt

wfurt commented Aug 7, 2023

Copy link
Copy Markdown
MemberAuthor

contributes to #30797

What's more to do on that issue?

nothing for 8.0. Plan to write some summary there and either keep it if we want to expose it on EventArg for consistency, open separate issue for it or close it with comment and wait if there is need for it.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor

This should be ready for another review round @stephentoub
I also added tests and fixes for #78448 since that is the same area.
I'll get perf comparison today

IntPtr socket = INVALID_SOCKET;
try
{
socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT);

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke Socket.OSSupportsUnixDomainSockets as Windows only support Stream for UDS.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor
MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDGen0AllocatedAlloc Ratio
ConnectAcceptAsyncJob-ZDTGEN\PR\corerun.exe761.8 us315.49 us363.32 us513.1 us471.6 us1,547.8 us1.490.75-1344 B1.00
ConnectAcceptAsyncJob-VRCVXQ\main\corerun.exe502.9 us15.49 us15.90 us509.7 us481.3 us522.3 us1.000.00-1345 B1.00
SendAsyncThenReceiveAsync_TaskJob-ZDTGEN\PR\corerun.exe104,494.1 us2,054.93 us2,018.22 us104,477.0 us100,835.1 us108,956.7 us1.000.04--NA
SendAsyncThenReceiveAsync_TaskJob-VRCVXQ\main\corerun.exe104,136.5 us3,092.13 us3,436.90 us102,974.0 us99,681.8 us112,911.4 us1.000.00--NA
ReceiveAsyncThenSendAsync_TaskJob-ZDTGEN\PR\corerun.exe685,473.6 us13,392.59 us14,329.93 us682,778.8 us660,879.8 us712,324.7 us0.960.15--NA
ReceiveAsyncThenSendAsync_TaskJob-VRCVXQ\main\corerun.exe728,471.7 us78,202.80 us90,058.46 us713,186.3 us510,999.9 us885,721.3 us1.000.00--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe102,279.1 us1,540.97 us1,366.03 us102,311.2 us100,069.7 us104,280.6 us0.960.05--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe104,810.3 us4,388.80 us5,054.15 us102,546.4 us98,808.3 us113,480.5 us1.000.00--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe674,034.8 us44,428.74 us47,538.26 us684,631.1 us486,587.7 us698,983.0 us0.940.08--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe719,407.7 us29,227.37 us33,658.29 us702,072.3 us683,461.1 us782,602.0 us1.000.00--NA
ReceiveFromAsyncThenSendToAsync_TaskJob-ZDTGEN\PR\corerun.exe1,587,406.7 us73,418.09 us84,548.38 us1,585,315.7 us1,407,020.1 us1,751,406.0 us0.990.08-4321064 B0.75
ReceiveFromAsyncThenSendToAsync_TaskJob-VRCVXQ\main\corerun.exe1,610,837.5 us96,790.05 us103,564.27 us1,616,955.2 us1,373,973.8 us1,811,356.2 us1.000.00-5761064 B1.00
SendToThenReceiveFromJob-ZDTGEN\PR\corerun.exe164,729.9 us1,880.36 us1,758.89 us164,669.6 us162,245.6 us168,004.6 us0.980.02500.00004320440 B0.75
SendToThenReceiveFromJob-VRCVXQ\main\corerun.exe168,548.9 us3,004.79 us2,810.68 us167,155.2 us164,936.9 us173,277.2 us1.000.00-5761408 B1.00

shows ~ 25% allocation reduction in legacy SendTo/ReceiveFrom. We can still probably do better - tabling for 9.0

@wfurt
wfurt merged commit 17d13fa into dotnet:mainAug 8, 2023
@wfurt
wfurt deleted the receiveFromAsync branch August 8, 2023 23:23
@ghostghost locked as resolved and limited conversation to collaborators Sep 8, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: add overloads with SocketAddress to Socket's SendTo and ReceiveFrom Debug.Assert when using ReceiveFrom on UnixDomainSocket

2 participants

@wfurt@stephentoub
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

add ReceiveFromAsync and SendToAsync with SocketAddress overload - #90086

Merged
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync
Aug 8, 2023
Merged

add ReceiveFromAsync and SendToAsync with SocketAddress overload#90086
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync

Conversation

@wfurt

@wfurtwfurt commented Aug 7, 2023

Copy link
Copy Markdown
Member

contributes to #30797
fixes#87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

also fixes#78448

@wfurtwfurt added this to the 8.0.0 milestone Aug 7, 2023
@wfurt
wfurt requested a review from stephentoubAugust 7, 2023 04:01
@wfurtwfurt self-assigned this Aug 7, 2023
@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

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

Issue Details

contributes to #30797
fixes #87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Sockets

Milestone:8.0.0

@stephentoub

Copy link
Copy Markdown
Member

contributes to #30797

What's more to do on that issue?

@stephentoubstephentoub left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share perf numbers?

Comment threadsrc/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs Outdated
Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
endPoint.Address.TryWriteBytes(addressBuffer2, out _);
return endPoint.Address.ScopeId == (long)scopeid && addressBuffer1.SequenceEqual(addressBuffer2);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we compare the scope id before doing the TryWriteBytes above?

Comment threadsrc/libraries/Common/src/System/Net/SocketAddress.cs Outdated
Comment threadsrc/libraries/Common/src/System/Net/SocketAddressExtensions.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs Outdated
public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, SocketAddress receivedAddress)
{
ThrowIfDisposed();
ArgumentNullException.ThrowIfNull(receivedAddress, nameof(receivedAddress));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ensure we have tests for all argument validation across all the new methods.

@wfurt

wfurt commented Aug 7, 2023

Copy link
Copy Markdown
MemberAuthor

contributes to #30797

What's more to do on that issue?

nothing for 8.0. Plan to write some summary there and either keep it if we want to expose it on EventArg for consistency, open separate issue for it or close it with comment and wait if there is need for it.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor

This should be ready for another review round @stephentoub
I also added tests and fixes for #78448 since that is the same area.
I'll get perf comparison today

IntPtr socket = INVALID_SOCKET;
try
{
socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT);

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke Socket.OSSupportsUnixDomainSockets as Windows only support Stream for UDS.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor
MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDGen0AllocatedAlloc Ratio
ConnectAcceptAsyncJob-ZDTGEN\PR\corerun.exe761.8 us315.49 us363.32 us513.1 us471.6 us1,547.8 us1.490.75-1344 B1.00
ConnectAcceptAsyncJob-VRCVXQ\main\corerun.exe502.9 us15.49 us15.90 us509.7 us481.3 us522.3 us1.000.00-1345 B1.00
SendAsyncThenReceiveAsync_TaskJob-ZDTGEN\PR\corerun.exe104,494.1 us2,054.93 us2,018.22 us104,477.0 us100,835.1 us108,956.7 us1.000.04--NA
SendAsyncThenReceiveAsync_TaskJob-VRCVXQ\main\corerun.exe104,136.5 us3,092.13 us3,436.90 us102,974.0 us99,681.8 us112,911.4 us1.000.00--NA
ReceiveAsyncThenSendAsync_TaskJob-ZDTGEN\PR\corerun.exe685,473.6 us13,392.59 us14,329.93 us682,778.8 us660,879.8 us712,324.7 us0.960.15--NA
ReceiveAsyncThenSendAsync_TaskJob-VRCVXQ\main\corerun.exe728,471.7 us78,202.80 us90,058.46 us713,186.3 us510,999.9 us885,721.3 us1.000.00--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe102,279.1 us1,540.97 us1,366.03 us102,311.2 us100,069.7 us104,280.6 us0.960.05--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe104,810.3 us4,388.80 us5,054.15 us102,546.4 us98,808.3 us113,480.5 us1.000.00--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe674,034.8 us44,428.74 us47,538.26 us684,631.1 us486,587.7 us698,983.0 us0.940.08--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe719,407.7 us29,227.37 us33,658.29 us702,072.3 us683,461.1 us782,602.0 us1.000.00--NA
ReceiveFromAsyncThenSendToAsync_TaskJob-ZDTGEN\PR\corerun.exe1,587,406.7 us73,418.09 us84,548.38 us1,585,315.7 us1,407,020.1 us1,751,406.0 us0.990.08-4321064 B0.75
ReceiveFromAsyncThenSendToAsync_TaskJob-VRCVXQ\main\corerun.exe1,610,837.5 us96,790.05 us103,564.27 us1,616,955.2 us1,373,973.8 us1,811,356.2 us1.000.00-5761064 B1.00
SendToThenReceiveFromJob-ZDTGEN\PR\corerun.exe164,729.9 us1,880.36 us1,758.89 us164,669.6 us162,245.6 us168,004.6 us0.980.02500.00004320440 B0.75
SendToThenReceiveFromJob-VRCVXQ\main\corerun.exe168,548.9 us3,004.79 us2,810.68 us167,155.2 us164,936.9 us173,277.2 us1.000.00-5761408 B1.00

shows ~ 25% allocation reduction in legacy SendTo/ReceiveFrom. We can still probably do better - tabling for 9.0

@wfurt
wfurt merged commit 17d13fa into dotnet:mainAug 8, 2023
@wfurt
wfurt deleted the receiveFromAsync branch August 8, 2023 23:23
@ghostghost locked as resolved and limited conversation to collaborators Sep 8, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: add overloads with SocketAddress to Socket's SendTo and ReceiveFrom Debug.Assert when using ReceiveFrom on UnixDomainSocket

2 participants

@wfurt@stephentoub
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

add ReceiveFromAsync and SendToAsync with SocketAddress overload - #90086

Merged
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync
Aug 8, 2023
Merged

add ReceiveFromAsync and SendToAsync with SocketAddress overload#90086
wfurt merged 11 commits into
dotnet:mainfrom
wfurt:receiveFromAsync

Conversation

@wfurt

@wfurtwfurt commented Aug 7, 2023

Copy link
Copy Markdown
Member

contributes to #30797
fixes#87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

also fixes#78448

@wfurtwfurt added this to the 8.0.0 milestone Aug 7, 2023
@wfurt
wfurt requested a review from stephentoubAugust 7, 2023 04:01
@wfurtwfurt self-assigned this Aug 7, 2023
@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost

ghost commented Aug 7, 2023

Copy link
Copy Markdown

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

Issue Details

contributes to #30797
fixes #87397

This is the last big step. There is no longer Internals.SocketAddress.
That allows to use provided SocketAddress without any additional processing.

I realized that the receivedSocketAddress from #88970 did not sue the approved name -> this fixes it makes sync & async same.

There is probably more room for cleanup but this still should be much better - even for the legacy overloads.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Sockets

Milestone:8.0.0

@stephentoub

Copy link
Copy Markdown
Member

contributes to #30797

What's more to do on that issue?

@stephentoubstephentoub left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share perf numbers?

Comment threadsrc/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs Outdated
Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
endPoint.Address.TryWriteBytes(addressBuffer2, out _);
return endPoint.Address.ScopeId == (long)scopeid && addressBuffer1.SequenceEqual(addressBuffer2);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we compare the scope id before doing the TryWriteBytes above?

Comment threadsrc/libraries/Common/src/System/Net/SocketAddress.cs Outdated
Comment threadsrc/libraries/Common/src/System/Net/SocketAddressExtensions.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs Outdated
Comment threadsrc/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs Outdated
public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, SocketAddress receivedAddress)
{
ThrowIfDisposed();
ArgumentNullException.ThrowIfNull(receivedAddress, nameof(receivedAddress));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ensure we have tests for all argument validation across all the new methods.

@wfurt

wfurt commented Aug 7, 2023

Copy link
Copy Markdown
MemberAuthor

contributes to #30797

What's more to do on that issue?

nothing for 8.0. Plan to write some summary there and either keep it if we want to expose it on EventArg for consistency, open separate issue for it or close it with comment and wait if there is need for it.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor

This should be ready for another review round @stephentoub
I also added tests and fixes for #78448 since that is the same area.
I'll get perf comparison today

IntPtr socket = INVALID_SOCKET;
try
{
socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT);

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke Socket.OSSupportsUnixDomainSockets as Windows only support Stream for UDS.

@wfurt

wfurt commented Aug 8, 2023

Copy link
Copy Markdown
MemberAuthor
MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDGen0AllocatedAlloc Ratio
ConnectAcceptAsyncJob-ZDTGEN\PR\corerun.exe761.8 us315.49 us363.32 us513.1 us471.6 us1,547.8 us1.490.75-1344 B1.00
ConnectAcceptAsyncJob-VRCVXQ\main\corerun.exe502.9 us15.49 us15.90 us509.7 us481.3 us522.3 us1.000.00-1345 B1.00
SendAsyncThenReceiveAsync_TaskJob-ZDTGEN\PR\corerun.exe104,494.1 us2,054.93 us2,018.22 us104,477.0 us100,835.1 us108,956.7 us1.000.04--NA
SendAsyncThenReceiveAsync_TaskJob-VRCVXQ\main\corerun.exe104,136.5 us3,092.13 us3,436.90 us102,974.0 us99,681.8 us112,911.4 us1.000.00--NA
ReceiveAsyncThenSendAsync_TaskJob-ZDTGEN\PR\corerun.exe685,473.6 us13,392.59 us14,329.93 us682,778.8 us660,879.8 us712,324.7 us0.960.15--NA
ReceiveAsyncThenSendAsync_TaskJob-VRCVXQ\main\corerun.exe728,471.7 us78,202.80 us90,058.46 us713,186.3 us510,999.9 us885,721.3 us1.000.00--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe102,279.1 us1,540.97 us1,366.03 us102,311.2 us100,069.7 us104,280.6 us0.960.05--NA
SendAsyncThenReceiveAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe104,810.3 us4,388.80 us5,054.15 us102,546.4 us98,808.3 us113,480.5 us1.000.00--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-ZDTGEN\PR\corerun.exe674,034.8 us44,428.74 us47,538.26 us684,631.1 us486,587.7 us698,983.0 us0.940.08--NA
ReceiveAsyncThenSendAsync_SocketAsyncEventArgsJob-VRCVXQ\main\corerun.exe719,407.7 us29,227.37 us33,658.29 us702,072.3 us683,461.1 us782,602.0 us1.000.00--NA
ReceiveFromAsyncThenSendToAsync_TaskJob-ZDTGEN\PR\corerun.exe1,587,406.7 us73,418.09 us84,548.38 us1,585,315.7 us1,407,020.1 us1,751,406.0 us0.990.08-4321064 B0.75
ReceiveFromAsyncThenSendToAsync_TaskJob-VRCVXQ\main\corerun.exe1,610,837.5 us96,790.05 us103,564.27 us1,616,955.2 us1,373,973.8 us1,811,356.2 us1.000.00-5761064 B1.00
SendToThenReceiveFromJob-ZDTGEN\PR\corerun.exe164,729.9 us1,880.36 us1,758.89 us164,669.6 us162,245.6 us168,004.6 us0.980.02500.00004320440 B0.75
SendToThenReceiveFromJob-VRCVXQ\main\corerun.exe168,548.9 us3,004.79 us2,810.68 us167,155.2 us164,936.9 us173,277.2 us1.000.00-5761408 B1.00

shows ~ 25% allocation reduction in legacy SendTo/ReceiveFrom. We can still probably do better - tabling for 9.0

@wfurt
wfurt merged commit 17d13fa into dotnet:mainAug 8, 2023
@wfurt
wfurt deleted the receiveFromAsync branch August 8, 2023 23:23
@ghostghost locked as resolved and limited conversation to collaborators Sep 8, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: add overloads with SocketAddress to Socket's SendTo and ReceiveFrom Debug.Assert when using ReceiveFrom on UnixDomainSocket

2 participants

@wfurt@stephentoub