[제품종류] IEC1000Lite
[개발환경] Visual Studio 2008 C#
=============== 질 문 ===============현재 저희측에서 사용중인 TCP-server 작동코드입니다.
현장에서 프로그램이 켜지면 종료 시 까지
IP 변경이나 TCP서버를 끄고 켜는 변화없이 계속 작동해야 하는 프로그램입니다.
접속하는 프로그램에서 한번 서버로의 접속이 불가능한 상태가 발생하면
저희쪽 프로그램을 재로딩하지 않는 이상 연결이 불가능한 상태입니다.
재현테스트를 위해 통신 연결 후 통신테스트를 한 결과는 끊긴 현상은 없었습니다.
하지만 실제 현장에서는 서버와의 연결을 끊고 연결하는 과정이 있어서
연결 및 해제를 반복해서 테스트 했지만 문제는 없었습니다.
다만 연결 후 랜선을 뽑고 연결하는 과정에서는
이미 연결된 클라이언트가 있어서 다른 접속을 막는 현상이나
클라이언트가 없더라도 접속자체가 안되는 현상이 있습니다.
TCP서버를 다시 끄고 켜면 문제는 해결되지만 저희 프로그램은 특성상 그런 작동을 할 수 없습니다.
물론 현장에서는 랜선을 뽑을 이유는 없지만
굳이 연결이 안되는 현상을 찾기 위해 테스트한 결과입니다.
이건 저희측 프로그램에서 접속이 안되는 현상이 있어서
HNS의 tcp서버 예제 프로그램으로 테스트한 결과입니다.
(1000Lite, V3.2.4 환경)
위의 코드를 참조하여 재접속문제가 발생할만한 다른 현상이나
해결방안에 대한 조언 부탁드립니다.
=============== 답 변 ===============
안녕하세요. HNS입니다.
지금 SmartX 3.2.4버전을 사용하고 계신데 해당 버전은 SmartX Old버전으로 현재 업데이트가 종료된 버전입니다.
향후 기술지원 및 업데이트를 적용하시기 위해서SmartX New 버전으로 업데이트 하시는걸 권장드립니다.
또한, 첨부해주신 코드를 확인한 결과, Thread를 직접 사용하고 있으며 SmartTCPServer를 동적 생성하여 사용 중인 것으로 확인되었습니다.
SmartTCP는 수신 및 연결 처리가 기본적으로 Thread 기반으로 설계되어 있어, 사용자 코드에서 별도의 Thread를 사용하는 것은 권장드리지 않습니다.
주기적으로 상태를 확인해야 하는 경우에는 SmartTCP에서 제공하는 기본 이벤트를 우선 활용해주시고, 이벤트로 처리할 수 없는 부분은 Timer를 사용하는 것을 원칙으로 하고 있습니다.
그리고SmartTCPServer를 동적으로 생성하여 사용하는 방식은 내부 검증이 완료되지 않은 구조로, 사용을 권장하지 않습니다.
내부적으로 테스트를 했을 때 동적 생성 방식 사용 시 특정 환경에서 클라이언트 연결 해제 시 프로그램이 비정상적으로 동작하는 현상이 확인되었습니다.
또한 말씀해주신 것처럼, 클라이언트에서 랜선을 분리했다가 재연결했을 때 통신이 되지 않는 현상은 하드웨어적으로 네트워크 연결이 끊어지는 상황이기 때문에, 소프트웨어에서는 별도의 통신 동작이 발생하지 않는 이상 이를 즉시 인지하기 어렵습니다.
TCP 통신에서는 Server와 Client 간 주기적인 Command 송수신을 통해 연결 상태를 확인해야 하며, Echo 방식으로 상태를 체크하고 끊김 발생 시 자동 재접속하도록 설계하는 것을 권장드립니다.
해당 구조는 SmartX New 버전에서 케이블 해제 테스트를 통해 정상 동작을 확인하였습니다.”
=============== 답 변 ===============
주기적으로 상태를 확인해야 하는 경우에는 SmartTCP에서 제공하는 기본 이벤트를 우선 활용해주시고, 이벤트로 처리할 수 없는 부분은 Timer를 사용하는 것을 원칙으로 하고 있습니다.
=> 원문에서도 밝혔듯이 제공해주신 SmartTCPMultServer프로그램의 타이머에서도 동일한 증상이 발생합니다.
=> 서버를 수동으로 UI를 통해 시작/중지를 할 수 없고 서버를 동적으로 생성하지 말라는건
오류가 나서 연결이 안될 경우에는 프로그램을 재실행할 수 밖에 없는 구조일까요?
TCP 통신에서는 Server와 Client 간 주기적인 Command 송수신을 통해 연결 상태를 확인해야 하며, Echo 방식으로 상태를 체크하고 끊김 발생 시 자동 재접속하도록 설계하는 것을 권장드립니다.
=> 현재 저희측 프로그램은 클라이언트가 송신한 결과에 대해서만 서버가 응답을 하는 구조입니다.
그럼 서버측 프로그램에서 수신과는 상관없이 일정주기로 Alive문자를 송신하고
만약 연결되지 않는 포트에 송신하게 되면 SmartTCPMultServer가 알아서 끊김을 해제 하고
다음의 연결을 정상적으로 처리할 수 있는 구조인가요?
=============== 답 변 ===============
Thread를 사용할 경우 UI에 직접 접근할 수 없어 Invoke 처리가 필요하며, 이로 인해 코드 구조가 복잡해지고 비효율적으로 변하게 됩니다.
SmartTCPMultiServer는 수신 및 연결 처리가 내부적으로 이미 Thread 기반으로 설계되어 있어, 사용은 권장드리지 않습니다.
이미 SmartTCPMultiServer에 구현된 기능을 어렵게 사용할 필요는 없으며, 이벤트나 SmartTimer를 사용하여, 해당 기능을 구현 하는걸 권장드립니다.
또한, SmartTCPServer를 동적 생성하여 사용 할 경우 문제가 발생하는 사례가 확인되어 현재는 해당 방식의 사용을 권장드리지 않고 있습니다.
위에서 안내드린 방식과 같이 Server 에서 Client로 Command를 전송하고, Client가 이를 수신한 후 다시 Server로 응답(Command)을 보내는 구조로 구현 하셔야됩니다.
Server는 일정 시간 동안 Command 응답을 받지 못할 경우 해당 IP의 Client 연결을 종료(Close)하고,
Client 측에서는 Command가 수신되지 않으면 자동으로 재접속(Reconnect)하도록 구성하셔야 되며, 해당 로직은 소프트웨어 개발 영역으로, 사용자 측에서 직접 구현해야 하는 부분입니다.
해당 방식으로 저희 측에서도 테스트를 진행하였으며, 말씀하신 증상인 LAN 케이블 분리 후 재연결 상황에서도 정상적으로 동작하는 것을 확인하였습니다.




