سؤال

أنا على وشك وضع بعض مآخذ الاشياء ذات الصلة في C++ و أود البرنامج يكون portable بين ويندوز و لينكس ممكن من البداية (مما يجعل المحمولة في وقت لاحق صعبة.)

لقد بحثت في المكتبات المختلفة, هناك واحد على C++ من alhem.net و بالطبع هناك دفعة::اسيو.دفعة::اسيو تبدو واعدة جدا ولكن سيكون كبير جدا الاعتماد على هذه التطبيقات الصغيرة.

هل يستحق حتى كتابة الأشياء أو يجب علي استخدام المكتبة ؟ إذا أنا أفعل ذلك بنفسي ما يمكن أن يكون أهم المزالق ؟

هل كانت مفيدة؟

المحلول

Winsocks ليست متوافقة جدا مع Posix مآخذ:

  • في Winsocks المقبس من نوع SOCKET.على Posix هو ببساطة ملف واصف (int), التي يمكن أن تؤدي طبيعية read() و write() المكالمات.
  • لا عودة الأخطاء بنفس الطريقة.
  • أنها لا تدعم بعض الخيارات في recv() و send().
  • يجب عليك تهيئة unitialize على Winsocks المكتبة مع اثنين من العروض الخاصة وظائف.
  • أنا لا أعتقد أنك يمكن إغلاق مآخذ توصيل Windows مع shutdown() أو close().انها شيء مثل closesocket() بدلا من ذلك.

يجب أن يكون هناك المزيد من الاختلافات, ولكن هذا ما أستطيع أن أتذكر الآن.إذا كنت تريد الحمل مع Winsocks, سيكون لديك مكتبة صغيرة على إغلاق مأخذ طباعة رسالة خطأ وهلم جرا.

ربما كنت اذهب مع boost::asio, شخصيا (لم أكن استخدامها ، على الرغم من).

نصائح أخرى

لقد وضعت بعض المحمولة مغلفة حول مآخذ.تأكد من أنك لا تذهب إلى أسفل كربي لين اللاعودة مؤلفة من WinSock2 الأحداث.بخلاف ذلك, كما أرى, أكبر الاختلافات هي:

  • لبدء الشبكات في ويندوز ، تحتاج إلى استدعاء ::WSAStartup(), إلى إغلاقها في ويندوز تشغيل ::WSACleanup();في لينكس لا تفعل شيئا ،
  • close() في لينكس closesocket() في ويندوز ،
  • المخزن المؤقت الافتراضي الأحجام تختلف بين كل برامج تشغيل أنظمة التشغيل ، لذلك تأكد من تعيين لهم باستخدام SO_RCVBUF و SO_SNDBUF,
  • SO_REUSEADDR يسرق العنوان على النوافذ يسمح كثرة إعادة فتح على لينكس ؛ ربما كنت ترغب فقط في استخدام هذا العلم في لينكس ،
  • صنع محجر غير مؤمن يستخدم ::ioctlsocket() في ويندوز ، ::fcntl() في لينكس ،
  • رأس ملفات مختلفة ، <sys/socket.h> والأصدقاء في لينكس ، <WinSock.h> في ويندوز ،
  • الذهاب المحمولة أسهل طريقة هي على الأرجح إلى استخدام ::select() انتظار البيانات للوصول ،
  • fd_sets هي مختلفة تماما على ويندوز/لينكس.هذا هو ذات الصلة فقط إذا كنت تحتاج إلى تحسين تهيئة fd_sets مثل عند إضافة/إزالة التعسفي مآخذ ،
  • في ويندوز ، أي خيط معلق على مأخذ صدر مع رمز خطأ عندما يتم إغلاق مأخذ, في لينكس الموضوع لا يزال في الانتظار.إذا كان الموضوع هو حجب المقبس مع على سبيل المثال ::recvfrom(), ، قد تنظر في استخدام ::sendto() الإفراج عن المماطلة الموضوع تحت لينكس.

كل شيء آخر من أي وقت مضى أنا فقط بحاجة عملت من låda.

ونلقي نظرة على المكتبة (ACE) "التكيف الاتصالات البيئة": (الصفحة الرئيسية ACE) ويوفر بعض تجريدات لطيفة والكثير من المرونة توالت كل شيء في مكتبة المحمولة التي تدعم ويندوز، ماك ولينوكس. لديها قليلا من منحنى التعلم حاد، ولكن حصلت على قيمة جيدة جدا منه.

وكم مأخذ الاشياء سوف تستخدم؟ لقد فعلت العديد من التطبيقات حيث كان الاشياء مأخذ كبير على مستوى عال (مفتوحة، القراءة والكتابة)، وعملت على أكمل وجه من ويندوز لينكس. إذا كان أكثر من ذلك - تذهب مع زيادة

وبصراحة، كنت تستخدم دفعة :: اسيو كما تفضيل الأول. إذا كنت تريد حقا أن ننكب وقذرة مع API مآخذ، يمكنك استخدام معيار مآخذ على غرار BSD API على كل من ويندوز ولينكس - انها مجرد أن على ويندوز سيكون لديك لتصل إلى (وتهيئة) كان Winsock2، في حين على لينكس سوف لا يكون لديك مكتبة منفصلة لربط ضد.

وإلقاء نظرة على هذا ... http://sourceforge.net/projects/cpp- مآخذ /

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top