네트워크 관련 TechNote가 다양하게 있어, 상황에 따라 참고해야 할 순서와 간단한 설명을 나타내는 표입니다. 아래 표를 참고하여 상황에 맞게 TechNote의 참고 순서를 확인하시기 바랍니다.
CASE 1 : TCP Socket 프로그램을 적용하기 위한 노하우 본 자료는
1. 네트워크 장애 발생 조건
2. 네트워크 장애로 인해 발생하는 문제점
3. 해결 방법
3-1. SmartTCPMultiServer의 ICMP 프로토콜 자동 지원 사용 방법
3-1-1. Server측 구현 방법(주요 코드 설명)
3-1-2. Client측 구현 방법(주요 코드 설명)
3-2. Server-Client간 연결 확인 Command 기반 프로토콜 구현 방법
3-2-1. Server측 구현 방법(주요 코드 설명)
3-2-2. Client측 구현 방법(주요 코드 설명)
4. 적용 예제
순서로 진행합니다.
본 TechNote에서 정의하는 네트워크 장애란, Server가 정상 동작 중인 상태에서 Client 측 LAN 케이블이 강제로 분리되거나 공유기, 스위치, 허브 등의 네트워크 장비 이상으로 인해 네트워크 연결이 단절되는 상황을 의미합니다.
2. 네트워크 장애로 인해 발생하는 문제점네트워크 장애로 인해 Client와 실제 통신이 되지 않는 경우에도, Server 측에서는 해당 Client가 여전히 연결된 상태로 인식되는 문제가 발생합니다.
Server 측에서 연결된 Client의 상태를 주기적으로 확인하여 연결 상태를 감지하는 방식을 사용해야 됩니다.
- [CASE-1] ICMP 프로토콜을 사용
Server에서 연결된 Client로 Ping을 주기적으로 전송한 뒤 일정 시간 동안 응답이 없을 경우 해당 연결을 해제하는 방법입니다.
이 방식은 SmartTCPMultiServer에 ClientConnected_AutoCheck 메서드로 이미 구현되어 있어 별도의 로직 구현 없이 간단히 사용할 수 있습니다. - [CASE-2] Command 기반 방식 사용
Server에서 Client로 연결 확인용 Command를 전송하고 Client가 해당 Command를 다시 Server로 반환하도록 프로토콜을 구현하는 방법입니다. 일정 시간 내에 응답이 수신되지 않을 경우 연결이 끊어진 것으로 판단하여 해당 Client의 연결을 해제합니다.
아래 표를 참고하여 상황에 맞는 방식을 선택하시기 바랍니다.
| [CASE-1] ICMP 프로토콜 | [CASE-2] Command 기반 프로토콜 | |
|---|---|---|
| 사용 환경 | ICMP 프로토콜을 지원하는 장비 | TCP를 사용하는 모든 장비 |
| 장점 | SmartTCPMultiServer에 이미 구현되어 있어 별도의 구현 없이 연결 상태 확인 가능 |
ICMP를 지원하지 않는 환경에서도 사용 가능 |
| 단점 | ICMP가 지원되지 않는 경우 사용이 불가능 | Server 측과 Client 측 모두 각각 별도의 코드 구현이 필요 |
3-1. SmartTCPMultiServer의 ICMP 프로토콜 자동지원 사용 방법
해당 방법은 SmartTCPMultiServer에 내장 돼있는 ClientConnected_AutoCheck메서드를 사용하는 방법 입니다.
해당 메서드는 SmartX 5.0.0.15 버전부터 지원되며, ICMP 프로토콜(Ping)을 이용하여 연결 상태를 확인하는 방식으로, Client 장비가 ICMP 프로토콜을 지원하는 환경에서만 사용이 가능합니다.
- [STEP-1] Server로 사용할IEC-Series와 Client 장비를 네트워크에 연결합니다.
실제 환경에 따라 무선 LAN 또는 유선 LAN 연결 방식과 DHCP 또는 Static IP 설정을 적절히 선택하여 사용하시기 바랍니다.
[무선 LAN을 통해 IP를 할당받은 예시] - [STEP-2] 내장치\Program Files 폴더 안에 있는 명령 프롬프트를 실행 합니다.

- [STEP-3] ICMP 프로토콜 지원 여부를 확인 하고자 하는 Client 디바이스 IP주소를 입력하여 Ping 명령을 테스트 합니다.

[ICMP 프로토콜 사용가능]
Ping이 정상적으로 동작하는 경우 ICMP 프로토콜 사용이 가능합니다.

[ICMP 프로토콜 사용 불가능]
Ping이 정상적으로 동작하지 않는 경우 아래와 같이 조치하시기 바랍니다.
1. Windows 계열 OS
방화벽에서 ICMP를 허용해야 하며, 자세한 설정 방법은 아래 “Windows 11 방화벽에서 ICMP 허용 설정 방법”을 참고하시기 바랍니다.
2. 그 외 장비
해당 제조사에 문의하여 ICMP 프로토콜 지원 여부를 확인이 필요합니다.
[ICMP를 지원하는 경우] : ICMP가 정상 동작하도록 설정합니다.
[ICMP를 지원하지 않는 경우] : 본 문서의 “3-2. Server-Client간 연결 확인 Command 기반 프로토콜 구현 방법” 을 참고하여 Command 기반 방식을 적용하시기 바랍니다.
- [STEP-1] 시작 검색창에 고급 보안이 포함된 Windows Defender 방화벽 검색 후 실행합니다.

- [STEP-2] 인바운드 규칙에서 “핵심 네트워킹 진단 - ICMP Echo Request (ICMPv4-In)” 규칙 사용을 눌러 ICMP를 허용합니다.
- [STEP-1] SmartTCPMultiServer 통신 환경에 맞게 기본적인 속성을 설정합니다.
// 네트워크 연결 기능을 사용하기 위한 Class 생성
// 해당 내용은 TechNote.80 [C#, VB.NET] IEC-Series에서 최적화된 Network 연결 처리 방법”을 참고하시기 바랍니다.
private CNetworkDeviceManagement networkDeviceManagement = new CNetworkDeviceManagement();
private void Form1_Load(object sender, EventArgs e)
{
// 최대 연결 Client 개수를 10개로 설정
smartTCPMultiServer1.MaxClient = 10;
// 한 번에 수신 가능한 데이터의 최대 크기 설정
smartTCPMultiServer1.MaxReceiveBufferSize = 1024;
// TCP Port 번호를 3377로 설정
smartTCPMultiServer1.Port = 3377;
// 데이터 수신 처리 방식을 동기 방식으로 설정
smartTCPMultiServer1.SendCallBackType = SmartX.SmartTCPMultiServer.CALLBACKTYPE.Sync;
// networkDeviceManagement 값 설정 코드 생략됨
- [STEP-2] 서버 시작 시 Client 연결 상태 자동 점검 기능을 시작합니다.( ClientConnected_AutoCheck메서드 사용)
// IP 할당 성공 및 Server 연결 재시도 시 발생되는 이벤트
private void NetworkDeviceManagement_On_Completion(ref bool bServerConnect)
{
if (smartTCPMultiServer1.IsStart == false)
{
smartTCPMultiServer1.Start();
// Client연결 상태 자동 감지 시작
// 3000ms 주기로 연결된 Client에 Ping을 전송하고, 응답이 없을 경우 2회 재시도 후 연결을 해제한다.
smartTCPMultiServer1.ClientConnected_AutoCheckStart(3000, 2);
{
- [STEP-3] 서버 종료 전 Client 연결 상태 자동 점검 기능을 중지합니다.
// 현재 SmartTCPMultiServer가 시작된 경우 중지
if (smartTCPMultiServer1.IsStart == true)
{
smartTCPMultiServer1.ClientConnected_AutoCheckStop();
// smartTCPMultiServer를 중지
smartTCPMultiServer1.Stop();
3-1-2. Client 측 구현 방법(주요 코드 설명)
Client 측에서는 Server와의 통신시 응답이 없는 경우, 이를 네트워크 장애로 판단하고 Server에 재연결을 시도하도록 구현해야 합니다.
- [STEP-1] SmartTCPClient 통신 환경에 맞게 기본적인 속성을 설정합니다.
// 네트워크 연결 기능을 사용하기 위한 Class 생성
// 해당 내용은 TechNote.80 [C#, VB.NET] IEC-Series에서 최적화된 Network 연결 처리 방법”을 참고하시기 바랍니다.
private CNetworkDeviceManagement networkDeviceManagement = new CNetworkDeviceManagement();
private void Form1_Load(object sender, EventArgs e)
{
smartTCPClient1.ServerIPAddress = "192.168.1.5";
// 한 번에 수신 가능한 데이터의 최대 크기 설정
smartTCPClient1.MaxReceiveBufferSize = 1024;
// TCP Port 번호를 3377로 설정
smartTCPClient1.Port = 3377;
// 서버 데이터 수신에 따른 응답 시간을 1000ms로 설정
smartTCPClient1.ReceiveTimeout = 1000;
// 데이터 전송 시점에 Server로 Ping을 전송하여 네트워크 연결 상태 확인
smartTCPClient1.IcmpKeepAliveEnabled = true;
// Connected, Receive, Send의 처리 방식 설정(Connect : 동기, Receive : 비동기, Send : 동기)
smartTCPClient1.SetBlocking(SmartX.SmartTCPClient.CALLBACKTYPE.Sync, SmartX.SmartTCPClient.CALLBACKTYPE.Async, SmartX.SmartTCPClient.CALLBACKTYPE.Sync);
// networkDeviceManagement 값 설정 코드 생략됨
- [STEP-2] SmartTCPClient 를 동기방식으로 시작합니다.
// IP 할당 성공 및 Server 연결 재시도 시 발생되는 이벤트
private void NetworkDeviceManagement_On_Completion(ref bool bServerConnect)
{
private void Connect_Blocking()
{
{
if (smartTCPClient1.Connect(3000) == true)
{
- [STEP-3] 송신 시 서버와 연결이 끊어진 경우 재연결 합니다.
private void Send_Blocking()
{
byte[] sendData = new byte[] {0x33, 0x45, 0x71, 0x52, 0x02};
if (smartTCPClient1.SendByte(sendData) == false)
{
// 서버와의 연결을 해제 후 재연결하도록 합니다.
smartTCPClient1.Close();
// 서버와 연결 재시도 [STEP-2] 코드를 참고하시기 바랍니다.
Connect_Blocking();
3-2. Server–Client 간 연결 확인 Command 기반 프로토콜 구현 방법
해당 방법은 SmartTCPMultiServer.ClientInfoList.Tag속성을 사용하여, Server에서 지속적으로 연결된 Client로 특정 Command를 주기적으로 전송하고, Client가 해당 Command를 그대로 Reply하도록 구성하여Server는 응답 수신 여부를 기준으로 Client의 연결 상태를 Tag 값으로 관리하는 방식입니다.
- [STEP-1] SmartTCPMultiServer 통신 환경에 맞게 기본적인 속성을 설정합니다.
// 네트워크 연결 기능을 사용하기 위한 Class 생성
// 해당 내용은 TechNote.80 [C#, VB.NET] IEC-Series에서 최적화된 Network 연결 처리 방법”을 참고하시기 바랍니다.
private CNetworkDeviceManagement networkDeviceManagement = new CNetworkDeviceManagement();
private void Form1_Load(object sender, EventArgs e)
{
smartTCPMultiServer1.MaxClient = 10;
// 한 번에 수신 가능한 데이터의 최대 크기 설정
smartTCPMultiServer1.MaxReceiveBufferSize = 1024;
// TCP Port 번호를 3377로 설정
smartTCPMultiServer1.Port = 3377;
// 데이터 수신 처리 방식을 동기 방식으로 설정
smartTCPMultiServer1.SendCallBackType = SmartX.SmartTCPMultiServer.CALLBACKTYPE.Sync;
// networkDeviceManagement 값 설정 코드 생략됨
- [STEP-2] 서버 시작 시 Client 연결 상태 자동 점검 기능을 시작합니다.(SmartTimer 사용)
// IP 할당 성공 및 Server 연결 재시도 시 발생되는 이벤트
private void NetworkDeviceManagement_On_Completion(ref bool bServerConnect)
{
if (smartTCPMultiServer1.IsStart == false)
{
smartTCPMultiServer1.Start();
// 3000ms 주기로 연결된 Client에 Echo Command를 전송.
EchoCheckTimer.Interval = 3000;
// Client연결 상태 자동 감지 시작
EchoCheckTimer.Start();
- [STEP-3] Server가 일정 주기마다 연결된 Client로 Echo 용 Command를 전송하고, Client로부터 Echo 응답 수신 여부를 기준으로 연결 상태를 판단하는 기능을 구현합니다.
// 수신된 데이터가 Echo 확인용 Command(Echo_Connect)인 경우,
// 해당 Client의 Echo 응답 수신 여부를 ClientInfoList.Tag 값에 기록합니다.
// Client로부터 데이터가 수신되었을 때 발생하는 이벤트
private void smartTCPMultiServer1_OnReceiveHandler(SmartX.SmartTCPMultiServer.CHandleClient.READINFO datas)
{
// 수신된 Byte데이터를 UniCode 문자열로 변환
strRecData = SmartX.SmartTCPMultiServer.ConvertUnicodeByteToString(datas.receiveDatas);
if (strRecData == "Echo_Connect")
{
SetEchoCommandCheck(datas.strIPAddress, strRecData);
lsbRecDatas.AddItem(strRecData);
private void SetEchoCommandCheck(string strIPAddress, string strTag)
{
for (int i = 0; i < smartTCPMultiServer1.ClientInfoList.Length; i++)
{
if (smartTCPMultiServer1.ClientInfoList[i].strIPAddress == strIPAddress)
{
smartTCPMultiServer1.ClientInfoList[i].Tag = strTag;
//이전 주기에서 Echo 응답이 없었던 Client는 네트워크 장애 또는 연결 끊김으로 판단하여 연결을 해제합니다.
//정상 Client에 대해서Tag 값을 초기화한 후 다시 Echo Command를 전송하여 다음 점검을 준비합니다.
private void EchoCheckTimer_Tick(object sender, EventArgs e)
{
EchoCheckTimer.Stop();
// Server가 동작 중이며, 연결된 Client 목록이 존재하는 경우에만 처리
if (smartTCPMultiServer1.IsStart == true && smartTCPMultiServer1.ClientInfoList != null)
{
for (int i = 0; i < smartTCPMultiServer1.ClientInfoList.Length; i++)
{
if (smartTCPMultiServer1.ClientInfoList[i].Tag == (object)"")
{
smartTCPMultiServer1.CloseClientIP(smartTCPMultiServer1.ClientInfoList[i].strIPAddress);
// Timer 재시작
EchoCheckTimer.Start();
return;
// Echo 응답 여부 확인을 위해 Tag 값 초기화
smartTCPMultiServer1.ClientInfoList[i].Tag = "";
// Client로 Echo 확인용 Command 전송
smartTCPMultiServer1.SendStringUnicodeIP(smartTCPMultiServer1.ClientInfoList[i].strIPAddress, " Echo_Connect");
// 모든 Client 확인 완료 후 Timer 재시작
EchoCheckTimer.Start();
3-2-2. Client 측 구현 방법(주요 코드 설명)
Client 측에서는 Server에서 일정 시간 Echo용 Command가 수신되지 않을 경우, 이를 네트워크 장애로 판단하고 Server에 재연결을 시도하도록 구현해야 합니다.
- [STEP-1] SmartTCPClient 통신 환경에 맞게 기본적인 속성을 설정합니다.
// 네트워크 연결 기능을 사용하기 위한 Class 생성
// 해당 내용은 TechNote.80 [C#, VB.NET] IEC-Series에서 최적화된 Network 연결 처리 방법”을 참고하시기 바랍니다.
private CNetworkDeviceManagement networkDeviceManagement = new CNetworkDeviceManagement();
private void Form1_Load(object sender, EventArgs e)
{
smartTCPClient1.ServerIPAddress = "192.168.0.5";
// 한 번에 수신 가능한 데이터의 최대 크기 설정
smartTCPClient1.MaxReceiveBufferSize = 1024;
// TCP Port 번호를 3377로 설정
smartTCPClient1.Port = 3377;
// 서버 데이터 수신에 따른 응답 시간을 1000ms로 설정
smartTCPClient1.ReceiveTimeout = 1000;
// Connected, Receive, Send의 처리 방식 설정(Connect : 동기, Receive : 비동기, Send : 동기)
smartTCPClient1.SetBlocking(SmartX.SmartTCPClient.CALLBACKTYPE.Sync, SmartX.SmartTCPClient.CALLBACKTYPE.Async, SmartX.SmartTCPClient.CALLBACKTYPE.Sync);
// networkDeviceManagement 값 설정 코드 생략됨
- [STEP-2] SmartTCPClient 를 동기방식으로 시작합니다. 이때 연결 상태 확인을 위한 Echo Command 수신 감지용 Timer를 시작합니다.
// IP 할당 성공 및 Server 연결 재시도 시 발생되는 이벤트
private void NetworkDeviceManagement_On_Completion(ref bool bServerConnect)
{
private void Connect_Blocking()
{
{
if (smartTCPClient1.Connect(3000) == true)
{
EchoCheckTimer.Interval = 5000;
// Echo Command 수신 감지용 Timer 시작.
EchoCheckTimer.Start();
labConnectStatus.Text = "서버 연결 성공";
- [STEP-3] Server로부터 Echo_Command 수신 여부를 기준으로 연결 상태를 판단하는 기능을 구현합니다.
// 데이터를 수신했을 때 발생하는 이벤트.
private void smartTCPClient1_OnReceiveHandler(byte[] datas)
{
// Unicode 형식의 수신 데이터를 문자열로 변환
strRecvDatas = SmartX.SmartTCPClient.ConvertUnicodeByteToString(datas);
if (strRecvDatas == "Echo_Connect")
{
smartTCPClient1.SendStringUnicode(strRecvDatas);
// Echo Command가 정상적으로 수신되었으므로
// 연결 상태 확인용 Timer의 Tick 시간을 초기화
EchoCheckTimer.Stop();
EchoCheckTimer.Start();
lsbReceiveDatas.AddItem(strRecvDatas);
// Echo Command가 일정 시간 동안 수신되지 않았을 때 호출되는 Timer 이벤트
private void EchoCheckTimer_Tick(object sender, EventArgs e)
{
EchoCheckTimer.Stop();
// 서버에서 일정 시간 동안 Echo Command가 수신되지 않았을 때
// 서버와의 연결을 해제 후 재 연결 하도록 합니다.
smartTCPClient1.Close();
// 서버와 연결 재시도 [Step-2] 코드를 참고하시기 바랍니다.
Connect_Blocking();
// Timer 재시작
EchoCheckTimer.Start();
4. 적용 예제 및 주요 코드
본 예제는 ICMP 프로토콜 방식과 Command 기반 프로토콜 방식을 각각 별도의 파일로 구분하여 구성하였으며, 해당 예제의 코드는 본문 상단에 첨부된 파일을 다운로드하여 확인해 주시기 바랍니다.
-
[Server 예제화면]
-
[Client 예제화면]
-
[Server 예제화면]

-
[Client 예제화면]





