Tại nơi làm việc, tôi đã được giao nhiệm vụ triển khai máy chủ TCP như một phần của thiết bị nô lệ Modbus. Tôi đã thực hiện rất nhiều đọc cả ở đây trên trao đổi stack và trên internet nói chung (bao gồm cả tuyệt vời http://beej.us/guide/bgnet/) nhưng tôi đang đấu tranh với một vấn đề thiết kế. Tóm lại, thiết bị của tôi chỉ có thể chấp nhận 2 kết nối và trên mỗi kết nối sẽ là các yêu cầu modbus đến mà tôi phải xử lý trong vòng điều khiển chính của tôi và sau đó trả lời với trạng thái thành công hoặc lỗi. Tôi có những ý tưởng sau đây về cách thực hiện điều này.Viết máy chủ TCP đa luồng trên Linux
Có một sợi listener tạo, liên kết, lắng nghe và chấp nhận kết nối, sau đó sinh ra một pthread mới để lắng nghe trên các kết nối dữ liệu đến và kết nối chặt chẽ sau một khoảng thời gian timeout nhàn rỗi. Nếu số lượng các chủ đề đang hoạt động hiện tại là 2, các kết nối mới sẽ được đóng ngay lập tức để đảm bảo chỉ có 2 được cho phép.
Không phát sinh chủ đề mới từ chuỗi người nghe, thay vào đó hãy sử dụng select() để phát hiện các yêu cầu kết nối đến cũng như modem kết nối đến kết nối đang hoạt động (tương tự như cách tiếp cận trong hướng dẫn Beejs).
- Tạo 2 chuỗi trình nghe mỗi chuỗi tạo ra một ổ cắm (cùng IP và số cổng) có thể chặn trên các cuộc gọi accept(), sau đó đóng socket fd và xử lý kết nối. Ở đây tôi (có lẽ ngây thơ) giả định rằng điều này sẽ chỉ cho phép tối đa 2 kết nối mà tôi có thể giải quyết bằng cách sử dụng chặn đọc.
Tôi đã sử dụng C++ trong một thời gian dài nhưng tôi khá mới để phát triển Linux. Tôi thực sự hoan nghênh bất kỳ đề xuất nào về cách tiếp cận trên là tốt nhất (nếu có) và nếu sự thiếu kinh nghiệm của tôi với Linux có nghĩa là bất kỳ ý tưởng nào thực sự là xấu. Tôi muốn tránh fork() và dính vào pthreads khi các yêu cầu modbus đến sẽ được xếp hàng đợi và đọc một vòng lặp điều khiển chính định kỳ. Cảm ơn trước cho tất cả lời khuyên.
Tôi thích âm thanh này - vấn đề duy nhất là vòng lặp chính của tôi không được chặn. Nó phải xử lý và định kỳ xử lý các yêu cầu từ các luồng trình nghe. Với điều này trong tâm trí bạn nói tùy chọn 2. sẽ là tốt nhất? – mathematician1975
@ mathematician1975 Bạn vẫn có thể sử dụng phương pháp của tôi, nhưng thay vì chặn trên 'accept' sử dụng ngắn hoặc không có thời gian chờ' select' (hoặc làm cho ổ cắm nghe không chặn và sử dụng 'accept' và kiểm tra' EAGAIN'/'EWOULDBLOCK ') để biết khi nào một kết nối có thể được chấp nhận. –
Tôi nghĩ rằng với những hạn chế về thời gian của tôi, đây là giải pháp tốt nhất để tôi theo đuổi trong ngắn hạn. Cảm ơn lời khuyên của bạn. – mathematician1975