ठीक है, सबसे पहले, अगर आपके पास कुछ है और यह काम कर रहा है, तो आमतौर पर इसे इस तरह छोड़ने का एक अच्छा विचार है। जो ठीक नहीं है उसे क्यों तोड़ा जाए?
लेकिन अगर आपको परेशानी हो रही है, और वास्तव में अपने नेटवर्किंग कोड को फिर से लिखना चाहते हैं, तो मुझे लगता है कि आपके पास चार मुख्य विकल्प हैं:
- मल्टीथ्रेड ब्लॉकिंग कोड (अभी आप क्या कर रहे हैं)
- स्तर-ट्रिगर अधिसूचना के साथ गैर-अवरुद्ध सॉकेट्स
- तत्परता परिवर्तन अधिसूचना के साथ गैर-अवरुद्ध सॉकेट्स
- अतुल्यकालिक कुर्सियां
बहुत सारे मल्टीप्लेयर (सहकर्मी से सहकर्मी से लेकर बड़े पैमाने पर मल्टीप्लेयर) क्लाइंट और सर्वर पर लिखे जाने के बाद, मुझे लगता है कि विकल्प 2 कम से कम जटिलता की ओर जाता है, जो बहुत अच्छे प्रदर्शन के साथ, सर्वर और क्लाइंट गेम दोनों के लिए है। एक करीबी दूसरे के रूप में, मैं विकल्प 4 के साथ जाऊंगा, लेकिन आमतौर पर आपको अपने पूरे कार्यक्रम पर पुनर्विचार करने की आवश्यकता होती है, और मुझे ज्यादातर यह सर्वरों के लिए उपयोगी लगता है और ग्राहकों के लिए नहीं।
विशेष रूप से, मैं एक मल्टीथ्रेडेड वातावरण में सॉकेट्स को ब्लॉक करने के खिलाफ सलाह देना चाहूंगा, क्योंकि ऐसा करने से आमतौर पर लॉकिंग और अन्य सिंक्रोनाइज़ेशन फीचर्स होते हैं, जो न केवल कोड की जटिलता को बढ़ाते हैं, बल्कि इसके प्रदर्शन को भी कम कर सकते हैं, क्योंकि कुछ लोग इंतजार करते हैं अन्य।
लेकिन इन सबसे ऊपर, अधिकांश सॉकेट कार्यान्वयन (और उस पर अधिकांश I / O कार्यान्वयन) न्यूनतम स्तर पर गैर-अवरुद्ध हैं। तुच्छ कार्यक्रमों के विकास को सरल बनाने के लिए ब्लॉकिंग ऑपरेशन बस प्रदान किए जाते हैं। जब एक सॉकेट ब्लॉक हो रहा है, तो उस धागे में सीपीयू पूरी तरह से निष्क्रिय है, इसलिए पहले से ही गैर-अवरुद्ध कार्य पर अवरुद्ध अमूर्त पर एक गैर-अवरुद्ध अमूर्त का निर्माण क्यों करें?
यदि आपने इसे आज़माया नहीं है तो नॉन-ब्लॉकिंग सॉकेट प्रोग्रामिंग थोड़ी कठिन है, लेकिन यह पता चला है कि यह काफी सरल है, और यदि आप पहले से ही इनपुट मतदान कर रहे हैं, तो आपके पास पहले से ही गैर-अवरुद्ध सॉकेट्स करने का मन है।
पहली चीज जो आप करना चाहते हैं वह सॉकेट को गैर-अवरुद्ध करने के लिए सेट करना है। आप उसके साथ करते हैं fcntl()
।
उसके बाद, इससे पहले कि आप कर send()
, recv()
, sendto()
, recvfrom()
, accept()
( connect()
या अन्य कॉल कि धागा ब्लॉक सकता है, तो आप फोन पर कुछ भिन्न है) select()
सॉकेट पर। select()
आपको बताता है कि बाद में पढ़ने या लिखने के संचालन को अवरुद्ध किए बिना सॉकेट पर किया जा सकता है या नहीं। अगर ऐसा है, तो आप अपने इच्छित ऑपरेशन को सुरक्षित रूप से कर सकते हैं, और सॉकेट ब्लॉक नहीं होगा।
एक खेल में यह शामिल करना काफी सरल है। यदि आपके पास पहले से गेम लूप है, उदाहरण के लिए:
while game_is_running do
poll_input()
update_world()
do_sounds()
draw_world()
end
आप इसे इस तरह से बदल सकते हैं:
while game_is_running do
poll_input()
read_network()
update_world()
do_sounds()
write_network()
draw_world()
end
कहाँ पे
function read_network()
while select(socket, READ) do
game.net_input.enqueue(recv(socket))
end
end
तथा
function write_network()
while not game.net_output.empty and select(socket, WRITE) do
send(socket, game.net_output.dequeue())
end
end
संसाधनों के संदर्भ में, एकमात्र पुस्तक जो मुझे लगता है कि हर कोई अपने बुकशेल्व में होना चाहिए, भले ही वह एकमात्र पुस्तक हो, जो कि " यूनिक्स नेटवर्क प्रोग्रामिंग, वॉल्यूम 1. " दिवंगत रिचर्ड स्टीवंस द्वारा की गई हो। इससे कोई फर्क नहीं पड़ता कि आप विंडोज या अन्य ओएस या भाषा सॉकेट प्रोग्रामिंग करते हैं। जब तक आप इस पुस्तक को नहीं पढ़ते, तब तक आप सॉकेट्स को नहीं समझते।
एक और संसाधन जहां कई सॉकेट प्रोग्रामिंग के संदर्भ में उपलब्ध समाधान का एक सामान्य अवलोकन (ज्यादातर सर्वर प्रोग्रामिंग के लिए प्रासंगिक) मिल सकती है इस पेज ।