소켓 통신 관련 질문이 있습니다.

현재 TCP/IP 기반 센서 데이터를 수집하는 데이터 수집기 서버를 만들고 있습니다.​

송수신 데이터 길이는 8 바이트이며, 송수신 주기는 30초입니다.​

소켓 하나당 하나의 스레드에서 동작 중이며 소켓 연결, 패킷 송수신, 파싱 등 역할을 수행합니다.

700개 이상 센서와 소켓 커넥션 및 데이터 송수신 시 기존 소켓이 해제되는 현상이 발생합니다.

물론 소켓 해제 시 스레드가 리셋되며 다시 연결을 시도하는 로직을 심어 데이터 수집엔 큰 문제가 없지만, 소켓 해제가 되지 않으며 연결 및 수집 가능한 소켓 개수를 더 많이 늘리고 싶습니다.

프론트 분야만 개발하다 이런 분야가 처음이라 어떻게 접근해야 하는지 잘 모르겠습니다.

도움 부탁 드리겠습니다.

해제되었을 때 try catch의 Exception의 에러값이라도 공유부탁드리겠습니다!

1 Like

간단한 방법[참고 1]

예를 들어 확장 가능한 애플리케이션의 일반적인 목표는?

이를 달성하는 한 가지 방법은 동기 I/O 사용에서 전환하는 것입니다. 비동기 I/O를 사용하고 I/O 완료 포트를 사용하여 실행 중인 스레드 수를 CPU 수와 일치시키는 데 도움을 줍니다.

소켓이 Thread 대신에 Task를 사용하도록 바꾸라는 것입니다.

구조적 방법

센서 하나에 쓰레드 하나는 낭비라고 생각됩니다. 수집 서버와 센서 사이에 어떤 장치(PLC 같은)를 연결하고, 수집 서버는 한 개의 소켓으로 그 장치와 통신하는 것이 좋을 듯 합니다.

[참고 1] Pushing the Limits of Windows: Processes and Threads
https://web.archive.org/web/20121117072019/http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

3 Likes

소켓 개수를 늘리려면 iocp, epoll 로 가야죠

1 Like

I/O pipelines - .NET | Microsoft Learn

예제.

TcpEcho/src/Server/Program.cs at master · davidfowl/TcpEcho (github.com)