पर मल्टीथ्रेडेड टीसीपी सर्वर लिखना काम पर मुझे मॉडबस दास डिवाइस के हिस्से के रूप में एक टीसीपी सर्वर को लागू करने के साथ काम सौंपा गया है। मैंने यहां स्टैक एक्सचेंज और इंटरनेट पर सामान्य रूप से बहुत कुछ पढ़ा है (उत्कृष्ट http://beej.us/guide/bgnet/ सहित) लेकिन मैं एक डिजाइन मुद्दे के साथ संघर्ष कर रहा हूं। संक्षेप में, मेरा डिवाइस केवल 2 कनेक्शन स्वीकार कर सकता है और प्रत्येक कनेक्शन पर आने वाले मॉडबस अनुरोध होंगे जो मुझे अपने मुख्य नियंत्रक पाश में संसाधित करना होगा और फिर सफलता या विफलता स्थिति के साथ जवाब देना होगा। मेरे पास यह लागू करने के तरीके के बारे में निम्नलिखित विचार हैं।लिनक्स
फिर एक नया pthread को आने वाले डेटा और एक निष्क्रिय समय समाप्ति की अवधि के बाद करीब कनेक्शन के लिए कनेक्शन पर सुनने spawns, एक श्रोता थ्रेड, बनाता है बांधता है, सुनता है और कनेक्शन स्वीकार लो। यदि सक्रिय धागे की संख्या वर्तमान में 2 है, तो केवल 2 सुनिश्चित करने के लिए नए कनेक्शन तुरंत बंद कर दिए जाते हैं।
श्रोता धागे से नए धागे को न उतारें, इसके बजाय इनकमिंग कनेक्शन अनुरोधों का पता लगाने के लिए चयन() का उपयोग करें, साथ ही इनकमिंग मोडबस सक्रिय कनेक्शन पर कनेक्ट होता है (बीज गाइड में दृष्टिकोण के समान)।
- 2 श्रोता धागे बनाएं जिनमें से प्रत्येक सॉकेट (एक ही आईपी और पोर्ट नंबर) बनाता है जो स्वीकृति() कॉल पर अवरुद्ध कर सकता है, फिर सॉकेट एफडी बंद कर सकता है और कनेक्शन से निपट सकता है। यहां मैं मान रहा हूं (शायद बेवकूफ़) यह मानते हुए कि यह केवल अधिकतम 2 कनेक्शनों को अनुमति देगा जिन्हें मैं ब्लॉकिंग पढ़ने के साथ सौदा कर सकता हूं।
मैं लंबे समय से सी ++ का उपयोग कर रहा हूं लेकिन मैं लिनक्स विकास के लिए बिल्कुल नया हूं। मैं वास्तव में किसी भी सुझाव का स्वागत करता हूं कि उपरोक्त में से कौन सा दृष्टिकोण सबसे अच्छा है (यदि कोई है) और यदि लिनक्स के साथ मेरा अनुभवहीनता का अर्थ है कि उनमें से कोई वास्तव में वास्तव में खराब विचार हैं। मैं कांटा() से बचने के लिए उत्सुक हूं और पठारों तक चिपक जाता हूं क्योंकि इनकमिंग मोडबस अनुरोधों को कतारबद्ध किया जा रहा है और समय-समय पर मुख्य नियंत्रक पाश को पढ़ा जा रहा है। किसी भी सलाह के लिए अग्रिम धन्यवाद।
मुझे इसकी आवाज़ पसंद है - केवल समस्या यह है कि मेरा मुख्य पाश सख्ती से अवरुद्ध नहीं होना चाहिए। यह प्रसंस्करण और आवधिक रूप से श्रोता धागे से अनुरोधों के साथ सौदा करना चाहिए। इस बात को ध्यान में रखते हुए आप विकल्प 2 कहते हैं। – mathematician1975
@ गणितज्ञ 1 9 75 आप अभी भी मेरी विधि का उपयोग कर सकते हैं, लेकिन 'स्वीकार' पर अवरुद्ध करने के बजाय शॉर्ट या नो-टाइमआउट 'चयन' का उपयोग करें (या सुनने की सॉकेट को गैर-अवरुद्ध करें और 'स्वीकार करें' का उपयोग करें और 'EAGAIN'/'EWOULDBLOCK के लिए जांचें ') यह जानने के लिए कि कनेक्शन कब स्वीकार किया जा सकता है। –
मुझे लगता है कि मेरी समय की बाधाओं को देखते हुए यह मेरे लिए अल्प अवधि में आगे बढ़ने का सबसे अच्छा समाधान है। आपके सुझाव के लिए धन्यवाद। – mathematician1975