C# - Server socket이 닫히면 Accept 시켰던 자식 소켓이 닫힐까요?
지인으로부터 제목과 같은 질문을 받았습니다. 저는 이론상 서버 소켓이 닫힌다고 해서 그것과 연결됐었던 자식 소켓들이 닫히지는 않을 거라고 했습니다.
그래도 이런 경우 ^^ 꼭 테스트를 해봐야 합니다.
예제는 대략 다음과 같이 만들어 두고,
using System.Net;
using System.Net.Sockets;
namespace ConsoleApp2;
internal class Program
{
static void Main(string[] args)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 16000);
Console.WriteLine(ep);
socket.Bind(ep);
socket.Listen(10);
bool accepted = false;
Thread t = new Thread(() =>
{
byte[] buffer = new byte[10];
Socket client = socket.Accept();
Console.WriteLine($"Client connected: {client.LocalEndPoint}:{client.RemoteEndPoint}");
accepted = true;
while (true)
{
int recvBytes = client.Receive(buffer);
if (recvBytes <= 0)
{
Console.WriteLine("Client disconnected.");
break;
}
Thread.Sleep(1000);
}
client.Close();
});
t.Start();
while (true)
{
if (accepted == true)
{
Console.WriteLine("Server closed.");
socket.Close();
break;
}
else
{
Thread.Sleep(16);
Console.Write(".");
}
}
Console.WriteLine("Press any key to exit...");
Console.ReadLine();
}
}
클라이언트가 접속하게 만들면 서버 측 출력이 이런 식으로 나옵니다.
0.0.0.0:16000
...........[생략]....................
Client connected: 172.17.0.2:16000:172.17.0.1:52110
Server closed.
Press any key to exit...
화면에 "Client disconnected." 메시지가 없으니, 서버 소켓을 닫아도 클라이언트 소켓은 여전히 접속 중인 것입니다.
혹시나 옵션이 있을까 싶어 찾아봤는데요,
IOControlCode Enum
; https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.iocontrolcode
SOL_SOCKET Socket Options
; https://learn.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
IPPROTO_TCP socket options
; https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options
제가 찾는 한에서는 없었습니다. 검색으로도 딱히 안 되는 것을 보면, 이런 기능은 없는 듯합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]