سؤال

لدينا بعض التعليمات البرمجية التسلسلية القديمة التي تتحقق من توفر المنفذ التسلسلي بمجرد فتحه ثم إغلاقه.نقوم الآن بإضافة دعم الشبكة إلى التطبيق الذي أريد إعادة استخدام الوظيفة من خلال توفير عنوان IP كسلسلة.

/**
 * So far I have tried:
 * A passed in portPath normally looks like:
\\?\acpi#pnp0501#1#1#{GUID}          
10.2.0.155:2001
//10.2.0.155:2001/
\\.\10.2.0.155:2001\
\\?\10.2.0.155:2001\
 * all without success.
 */
    bool PortIsAvailable( const CString& portPath )
    {
        HANDLE hCom = ::CreateFile( portPath,
                                   GENERIC_READ | GENERIC_WRITE,
                                   0,                    // comm devices must be opened with exclusive-access
                                   NULL,                 // no security attributes
                                   OPEN_EXISTING,        // comm devices must use OPEN_EXISTING
                                   FILE_FLAG_OVERLAPPED, // not overlapped I/O
                                   NULL );                // hTemplate must be NULL for comm devices
        if (INVALID_HANDLE_VALUE != hCom ) 
        {
            ::CloseHandle( hCom );
            return true;
        }
        return false;
    }

أعلم أنه يمكنني استخدام الاتصال متبوعًا بإيقاف التشغيل ولكني أريد إعادة استخدام الوظيفة مع الحد الأدنى من التغييرات.إذا كان بإمكاني إعادة استخدام الوظيفة كثيرًا، كان ذلك أفضل.إذا لم يكن الأمر كذلك فسأضطر إلى كتابة التعليمات البرمجية التي تحدد ما إذا كان مأخذ توصيل أم لا.

كنت أتساءل ما هي الطريقة الصحيحة لفتح مأخذ التوصيل عبر CreateFile؟

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

المحلول

لا يمكنك إنشاء مأخذ توصيل عبر CreateFile.يجب عليك استخدام النوافذ واجهة برمجة تطبيقات المقبس لهذا الغرض.لإنشاء مقبض SOCKET، يمكنك استخدامه WSASocket.لاحظ أنه يمكن استخدام SOCKET الذي يتم إرجاعه بواسطة هذه الوظيفة كمقبض Windows مع البعض وظائف Windows، مثل ReadFile وWriteFile.

نصائح أخرى

لا أعتقد أنه يمكنك التعامل مع المقابس CreateFile().المقابس عبارة عن تجريد تم استيراده من BSD (iirc) وتم تنفيذه بطريقة متوافقة مع الاسم (في الأصل عبر winsock.h, ، وحاليا winsock2.h).لا أعتقد أن MS أضاف دعمًا لمآخذ التوصيل إلى CreateFile().

المزيد من المنطق:معظم (كل شيء؟) CreateFile() يعالج إرجاع مقبض Windows الأصلي.نظرًا لأن المقابس عبارة عن تجريد غير أصلي، فهي لا تحتوي على مقبض أصلي في نظام التشغيل، لذلك لن يكون ذلك منطقيًا CreateFile() للتعامل معهم.

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