افتح مأخذ التوصيل باستخدام CreateFile
-
21-08-2019 - |
سؤال
لدينا بعض التعليمات البرمجية التسلسلية القديمة التي تتحقق من توفر المنفذ التسلسلي بمجرد فتحه ثم إغلاقه.نقوم الآن بإضافة دعم الشبكة إلى التطبيق الذي أريد إعادة استخدام الوظيفة من خلال توفير عنوان 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()
للتعامل معهم.