-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Closed
Labels
area-System.Net.Socketsin-prThere is an active PR which will close this issue when it is mergedThere is an active PR which will close this issue when it is merged
Milestone
Description
Description
Socket.ConnetAsync
sporadically returns successfully but the socket is not connected (Socket.Connected == false
). This occurs when canceling ConnectAsync
while it's in progress after the server side accepts the socket.
Reproduction Steps
using System.Net;
using System.Net.Sockets;
while (true)
{
using var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
serverSocket.Listen();
using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
using var cts = new CancellationTokenSource();
ValueTask connectTask = socket.ConnectAsync(serverSocket.LocalEndPoint!, cts.Token);
using var _ = await serverSocket.AcceptAsync();
cts.Cancel();
try
{
await connectTask;
if (!socket.Connected)
{
Console.Error.WriteLine("unexpected non-connected socket after successfull ConnectAsync");
return 1;
}
}
catch (OperationCanceledException)
{
// Expected if canceled before connect.
}
}
Expected behavior
The ConnectAsync
call should either throw OperationCanceledException
or return a connected socket.
Actual behavior
ConnectAsync
returns but the socket is not connected
Regression?
No response
Known Workarounds
No response
Configuration
.NET Core 6
Linux Debian Buster and macOS
Other information
No response
Metadata
Metadata
Assignees
Labels
area-System.Net.Socketsin-prThere is an active PR which will close this issue when it is mergedThere is an active PR which will close this issue when it is merged
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
ghost commentedon Sep 20, 2022
Tagging subscribers to this area: @dotnet/ncl
See info in area-owners.md if you want to be subscribed.
Issue Details
Description
Socket.ConnetAsync
sporadically returns successfully but the socket is not connected (Socket.Connected == false
). This occurs when cancelingConnectAsync
while it's in progress after the server side accepts the socket.Reproduction Steps
Expected behavior
The
ConnectAsync
call should either throwOperationCanceledException
or return a connected socket.Actual behavior
ConnectAsync
returns but the socket is not connectedRegression?
No response
Known Workarounds
No response
Configuration
.NET Core 6
Linux Debian Buster and macOS
Other information
No response
area-System.Net.Sockets
wfurt commentedon Sep 20, 2022
I think on macOS this can happen when peer closes the connection. Can you perhaps post complete repro @bentoi that has both sides?
bentoi commentedon Sep 21, 2022
It has both sides already. The test case creates a server socket to accept connections over the loopback interface. The accepted server socket is not disposed while the client socket connection establishment is in progress or canceled. Not that this occurs on both Linux and macOS. I didn't get a chance to check Windows.
liveans commentedon Sep 27, 2022
I was able to reproduce the issue in main, .NET 7.0, 6.0 and 5.0. I think it should be easy to fix. Not critical. We can investigate it more deeply.
karelz commentedon Sep 29, 2022
Triage: It is unpleasant behavior, however, it is the only report in last few years (it is an edge case scenario).
kaiohenrique commentedon Jul 11, 2024
Hi. With a slightly different repro, I have been able to get disposed Sockets in Connected=true state. Could this be a potential socket leaking case?
Forward CancellationToken in Task-based Socket.ConnectAsync (dotnet#1…