2011-01-06 14 views
5

मेरे पास एक प्रोग्राम है जो विंसॉक का उपयोग करके कुछ नेटवर्किंग करता है, और हमारी आवश्यकताओं में से एक अभी हमारे कार्यक्रम को लिनक्स पर बंद करना है। ऐसा करने से हमें रोकने वाली एकमात्र चीज विंसॉक है।पोर्टिंग विंसॉक से लिनक्स सॉकेट

मेरा प्रश्न है: मैं इसे लिनक्स कार्यान्वयन में कितना आसान बना सकता हूं?

क्या कोई समस्या है जिसके बारे में मुझे अवगत होना चाहिए, और अगर मैं उचित हेडर फाइलों को शामिल करता हूं, तो मुझे किस तरह की चीजों को संभालना सुनिश्चित करना होगा?

किसी भी मदद के लिए धन्यवाद!

मैं कोड पोस्ट करूंगा लेकिन दुर्भाग्य से कानूनी कारणों से मैं दुर्भाग्य से नहीं हो सकता। लेकिन, हमारे कोड निम्न का उपयोग करता है:

WSAStartup(..) 
WSACleanup(..) 
Socket(..) 
sendto(..) 
recvfrom(..) 
ioctlsocket(..) 
setsocketopt(..) 

उत्तर

6

यह निर्भर करेगा कि आप किसी भी विंडोज़ विशिष्ट नेटवर्किंग कार्यक्षमता का उपयोग करते हैं या यदि आप अधिकतर ज्यादातर बीएसडी संगत एपीआई का उपयोग कर रहे हैं।

तो, यदि आप ओवरलैप्ड I/O और I/O समापन बंदरगाहों और विंसॉक एपीआई के अन्य उन्नत हिस्सों का उपयोग कर रहे हैं तो चीजें बंदरगाह के लिए बहुत मुश्किल हो जाएंगी और यदि आप बस बीएसडी संगत सामान का उपयोग कर रहे हैं तो यह एक पतली परत अनुवाद लिखने के लिए या बस विनसॉक स्टार्टअप और एक खिड़कियों विशिष्ट ifdef अंदर बंद चीजें आसान होना चाहिए ...

यह आपकी मदद कर सकते हैं: http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

0

कोड देखकर बिना, यह कहने के लिए कितना आसान है कठिन है। लेकिन आप sys/sockets.h में एनालॉग में winsock कॉल को प्रतिस्थापित करने में सक्षम होना चाहिए।

3

एकमात्र कॉल जो पोर्टिंग मुश्किल बनाते हैं वे डब्लूएसए * कॉल हैं।

WSAStartup() -> nop WSACleanup() -> nop

सॉकेट/setsockopt -> सॉकेट/setsockopt

* nix के तहत, सॉकेट डिफ़ॉल्ट रूप से अवरुद्ध कर रहे हैं और यह आवश्यक या उपयोग करने के लिए संभव नहीं है अजीब सेटॉकटॉप कॉल इसके साथ बेवकूफ है।

ioctlsocket -> ioctl

* nix के तहत हम अतुल्यकालिक सॉकेट ज्यादा पसंद का चयन करें() सिस्टम कॉल का उपयोग करना पसंद नहीं है।

---- इस उत्तर के बाकी केवल Win95 संगत विनसॉक को लागू करने के लिए ---- लगता

दुर्भाग्य से मूल सॉकेट() विनसॉक में कुछ मामलों में टूट गया था के रूप में, तो आप शायद इस्तेमाल किया WSASocket() और इसलिए उन कॉल को कन्वर्ट करना होगा।

+0

हमारा कोड सॉकेट() का उपयोग करता है, मैंने पोस्ट किया है कि कोड में कौन से फ़ंक्शंस का उपयोग किया जाता है, क्योंकि मैं वास्तविक कोड पोस्ट नहीं कर सकता। –

+0

अवरुद्ध करने के साथ बेवकूफ़ बनाना संभव नहीं है? [Fcntl (2) का उपयोग कर सॉकेट फ़ाइल डिस्क्रिप्टर पर O_NONBLOCK ध्वज सेट करके सॉकेट पर गैर-अवरुद्ध I/O करना संभव है।] (Http://linux.die.net/man/7/socket) आप ' ठीक है हालांकि यह एक अलग कार्य है, न कि 'setockopt'। –

+0

बेन वोगेट: बिल्कुल। विंडोज सेटोकॉप्ट कॉल को सभी नए सॉकेट के लिए नल हैंडल और सेट मोड पर कॉल किया जाता है। – Joshua

8

कार्यों की उस सूची के आधार पर, बातें करना चाहिए और अधिक या कम काम सिर्फ। WSAStartup और WSACleanup पर कॉल के आसपास जोड़ें (लिनक्स समकक्ष कुछ भी नहीं करना है, सॉकेट लाइब्रेरी स्वचालित रूप से प्रारंभ हो जाती है)।

सॉकेट विकल्पों को सेट करते समय आपको कुछ ओएस-निर्भर कोड की भी आवश्यकता हो सकती है, उनमें से कुछ समान हैं, कुछ नहीं हैं, और प्रकार अलग-अलग हो सकते हैं।

संबंधित मुद्दे