[제품종류] 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가 알아서 끊김을 해제 하고
다음의 연결을 정상적으로 처리할 수 있는 구조인가요?




