1.
포트 21111은 로컬 호스트(127.0.0.1)에서만 수신 대기 상태입니다.
이는 이 포트가 현재 시스템 내의 로컬 네트워크 인터페이스에서만 접근 가능하다는 것을 의미합니다.
외부 네트워크에서 이 포트에 접근할 수 없습니다.
root@sinfo:~# netstat -an | grep 21111
tcp 0 0 127.0.0.1:21111 0.0.0.0:* LISTEN
2.
포트 21111은 모든 네트워크 인터페이스(0.0.0.0)와 로컬 IPv6 주소(::1)에서 수신 대기 상태입니다.
이는 포트 21111 가 외부 네트워크와 로컬 네트워크 모두에서 접근 가능하다는 것을 의미합니다.
root@sinfo:~# netstat -an | grep 21111
tcp 1 0 0.0.0.0:21111 0.0.0.0:* LISTEN
tcp6 0 0 :::21111 :::* LISTEN
root@sinfo:~#
1번과 2번의 소스차이는(?)
#if(false)
private void Init()
{
//소켓 객체 생성 (TCP 소켓)
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//엔드포인트에 소켓 바인드(Bind)
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 21111);
listener.Bind(localEndPoint);
//Listen소켓의 대기열의 길이를 설정합니다.
listener.Listen(10);
PublicApiNM.SendToDebug(3, "()(Init)(Listen)");
while (true)
{
try
{
Socket handler = listener.Accept();
PublicApiNM.SendToDebug(3, "()(Init)(Accept)");
//richTextBox1.Text = richTextBox1.Text + "Socket handler = listener.Accept() OK" + "\n";
Thread RealSocModel = new Thread(new ParameterizedThreadStart(SocketRunHandler));
RealSocModel.Start(handler);
}
catch (Exception ex)
{
//
}
}
listener.Close();
}
#endif
#if(true)
private void Init()
{
// IPv4와 IPv6 소켓 객체 생성 (TCP 소켓)
ipv4Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ipv6Listener = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
// IPv4와 IPv6 엔드포인트 설정
IPEndPoint ipv4EndPoint = new IPEndPoint(IPAddress.Any, 21111); // 모든 IPv4 주소에서 수신 대기
IPEndPoint ipv6EndPoint = new IPEndPoint(IPAddress.IPv6Any, 21111); // 모든 IPv6 주소에서 수신 대기
// 소켓을 엔드포인트에 바인드
ipv4Listener.Bind(ipv4EndPoint);
ipv6Listener.Bind(ipv6EndPoint);
// 소켓의 대기열 길이 설정
ipv4Listener.Listen(10);
ipv6Listener.Listen(10);
PublicApiNM.SendToDebug(3, "()(Init)(Listen)");
while (!_shouldStop)
{
try
{
// 소켓이 닫혔는지 확인하고, 닫혔으면 루프 종료
if (ipv4Listener.Poll(1000, SelectMode.SelectRead) && ipv4Listener.Available == 0)
{
break;
}
if (ipv6Listener.Poll(1000, SelectMode.SelectRead) && ipv6Listener.Available == 0)
{
break;
}
// 클라이언트 연결 수신 대기
Socket ipv4Handler = ipv4Listener.Accept();
Socket ipv6Handler = ipv6Listener.Accept();
PublicApiNM.SendToDebug(3, "()(Init)(Accept)");
// 새 스레드에서 클라이언트 처리
Thread ipv4Thread = new Thread(new ParameterizedThreadStart(SocketRunHandler));
ipv4Thread.Start(ipv4Handler);
Thread ipv6Thread = new Thread(new ParameterizedThreadStart(SocketRunHandler));
ipv6Thread.Start(ipv6Handler);
}
catch (SocketException ex)
{
if (_shouldStop)
{
// _shouldStop이 true일 경우, listener가 닫히면서 예외 발생할 수 있음
break;
}
// 그 외의 소켓 예외 처리
PublicApiNM.SendToDebug(3, "()(Init)(Exception):" + ex.Message);
}
catch (Exception ex)
{
// 기타 예외 처리
PublicApiNM.SendToDebug(3, "()(Init)(Exception):" + ex.Message);
}
}
// 소켓 닫기
ipv4Listener.Close();
ipv6Listener.Close();
PublicApiNM.SendToDebug(3, "()(Init)(Stopped)");
}
public void StopInitThread()
{
_shouldStop = true;
// 소켓을 닫아 블로킹 호출에서 예외를 발생시키도록 함
if (ipv4Listener != null)
{
ipv4Listener.Close();
}
if (ipv6Listener != null)
{
ipv6Listener.Close();
}
}
#endif