직장에서 TCP 서버를 Modbus 슬레이브 장치의 일부로 구현해야했습니다. 스택 교환과 인터넷 (일반적으로 우수 http://beej.us/guide/bgnet/ 포함)에서이 글을 많이 읽었지만 디자인 문제로 어려움을 겪고 있습니다. 요약하면, 내 장치는 단지 2 개의 연결 만 허용 할 수 있으며 각 연결에서 메인 컨트롤러 루프에서 처리해야하는 수신 Modbus 요청이되며 성공 또는 실패 상태로 회신합니다. 나는 이것을 구현하는 방법에 대해 다음과 같은 생각을 가지고있다. Linux에 멀티 스레드 TCP 서버 작성
- 는 들어오는 데이터 및 유휴 제한 시간 후 가까운 연결을위한 연결에서 수신 할 수있는 새로운 pthread에 급부상, 생성 결합, 수신 및 연결을 허용 리스너 스레드를 가지고. 현재 활성 스레드 수가 2 인 경우 새 연결이 즉시 닫혀 2 개만 허용됩니다.
리스너 스레드에서 새 스레드를 생성하지 않고 select()를 사용하여 들어오는 연결 요청뿐만 아니라 활성 연결에서 들어오는 Modbus 연결을 감지합니다 (Beejs 가이드의 접근 방식과 유사).
- accept() 호출에서 차단할 수있는 소켓 (동일한 IP 및 포트 번호)을 만드는 2 개의 리스너 스레드를 작성한 다음 소켓 fd를 닫고 연결을 처리하십시오. 여기에서는 (아마도 순진하게) 이것이 블로킹 읽기를 사용하여 처리 할 수있는 최대 2 개의 연결 만 허용한다고 가정합니다.
저는 오랫동안 C++을 사용해 왔지만 저는 리눅스 개발에 상당히 익숙합니다. 위의 접근법 중 어느 것이 가장 좋을지, 그리고 Linux에 대한 나의 미숙함이 그 중 하나가 실제로 정말 나쁜 아이디어라는 것을 의미하는 것이라면 어떤 제안도 환영 할 것입니다. 들어오는 modbus 요청이 대기열에 올라서 주기적으로 주 컨트롤러 루프를 읽으므로 fork()를 피하고 pthreads를 고수하고 싶습니다. 어떤 조언을 주셔서 미리 감사드립니다.
나는이 소리를 좋아합니다. 유일한 문제는 내 메인 루프가 엄격히 차단해서는 안된다는 것입니다. 처리를 수행하고 리스너 스레드의 요청을 주기적으로 처리해야합니다. 이 점을 염두에두면 옵션 2가 가장 좋을까요? – mathematician1975
@ mathematician1975 내 메소드를 사용할 수는 있지만'accept'를 블로킹하는 대신'select' 타임 스탬프를 사용하거나'listen' 소켓을 비 블로킹으로 만들고'accept'를 사용하고'EAGAIN' /'EWOULDBLOCK ') 연결을 수락 할 수있는시기를 알 수 있습니다. –
시간 제약이 주어진다면 이것이 단기적으로 추구 할 수있는 최선의 해결책이라고 생각합니다. 조언 해 주셔서 감사합니다. – mathematician1975