Udpcap عبارة عن مضاهاة UDP-Socket للاستقبال فقط استنادًا إلى Npcap. يستخدم برنامج تشغيل التقاط الحزمة Npcap لالتقاط حركة مرور إيثرنت، وتحليل جميع الرؤوس الضرورية وإرجاع حمولة UDP. باستخدام Udpcap يمكنك فتح مقبس UDP واستقبال البيانات دون فتح المقبس فعليًا!
المشروع مخصص لنظام التشغيل Windows فقط، حيث أن Npcap يستهدف Windows فقط أيضًا.
يمكن لـ Udpcap:
لا يمكن لـ Udpcap:
يتم جلب جميع التبعيات بسهولة بواسطة CMake. ومع ذلك، لاستخدام Udpcap فعليًا، يجب تثبيت برنامج التشغيل Npcap. ضع في اعتبارك أن ترخيص Npcap هو ملكية خاصة.
يبدو استخدام برنامج تشغيل التقاط الحزم لمحاكاة مقبس UDP فكرة رهيبة، بينما يمكنك فقط استخدام مقبس UDP مناسب؟ حسنا، ربما هو كذلك. ولكن مهلا، هناك مشكلة محددة للغاية في Windows يمكن لهذا المشروع حلها.
بالمقارنة مع Windows 7، يحتوي Windows 10 على Windows Defender الأكثر قوة (خدمة MpsSvc). عند تلقي العديد من حزم البث المتعدد UDP بمقبس عادي على نظام التشغيل Windows 10، يتسبب Windows Defender في تحميل ضخم لوحدة المعالجة المركزية مما يجعل النظام بأكمله بطيئًا. يبدو أن المشكلة تزداد سوءًا، عندما يكون جهاز Windows متصلاً بمجال Windows، كما يحدث عادةً في شبكات الشركات الكبيرة. عند فحص النظام باستخدام Process Hacker، يمكن للمرء أن يرى أن عملية System
(Windows Kernel) تشغل نفس مساحة نواة وحدة المعالجة المركزية بأكملها. هناك دائمًا مؤشر ترابط واحد داخل kernel يستخدم جميع دورات وحدة المعالجة المركزية ويحتوي على tcpip.sys
في مكدس الاستدعاءات الخاص به:
لا يمكن إلغاء تنشيط جدار حماية Defender في نظام التشغيل Windows 10 بعد الآن. ستستمر خدمة MpsSvc في العمل عند إلغاء تنشيطها مؤقتًا، لأنها توفر المزيد من ميزات الأمان إلى جانب جدار حماية Defender.
في نظام التشغيل Windows، يستخدم كل وصول إلى الشبكة (يتم بدء تشغيله من قبل مساحة المستخدم) Winsocks/2 API. تستخدم واجهة برمجة التطبيقات هذه برنامج تشغيل نظام ملفات Kernel-Mode Afd.sys
، والذي يستخدم بعد ذلك برنامج تشغيل بروتوكول النقل tcpip.sys
. برنامج التشغيل tcpip.sys هو المكان الذي يحدث فيه كل سحر البروتوكول في Windows. هذه أيضًا هي النقطة التي يقوم فيها جدار حماية Windows Defender بتحليل حركة المرور. قامت Microsoft بإنشاء واجهة برمجة تطبيقات كاملة لهذا الغرض فقط: نظام تصفية Windows (WFP). تتوفر واجهة برمجة التطبيقات هذه في نظام التشغيل Windows Vista والإصدارات الأحدث. أسفل tcpip.sys
، يأتي فقط NDIS.sys
(مواصفات واجهة برنامج تشغيل الشبكة) وبرامج تشغيل Ethernet NIC الفعلية. لذا، للتغلب على مشكلة تحميل وحدة المعالجة المركزية لجدار حماية Defender، نحتاج إلى تجاوز برنامج التشغيل tcpip.sys
بالكامل وكل شيء فوقه. ارجع إلى الصورة أدناه (الخطوط السوداء) للحصول على نظرة عامة. عند استخدام Npcap، لا يرى Windows Defender أي مآخذ توصيل مفتوحة ولا يقوم بتحليل حركة المرور. ومع ذلك، فهذا يعني أنه يجب إعادة تنفيذ حزمة بروتوكول UDP في مساحة المستخدم (وهذا هو المكان الذي يكون فيه Udpcap مفيدًا!) .
يحتوي Udpcap على واجهة برمجة تطبيقات بسيطة للغاية مع أوجه تشابه قوية مع واجهات برمجة تطبيقات المقبس المعروفة الأخرى:
# include < iostream >
# include < udpcap/udpcap_socket.h >
int main ()
{
// Create a Udpcap socket and bind it to a port. For this example we want to
// receive data from any local or remote source and therefore not bind to an
// IP address.
Udpcap::UdpcapSocket socket;
socket. bind ( Udpcap::HostAddress::Any (), 14000 );
for (;;)
{
// Allocate a buffer for the received datagram. The size of the buffer
// should be large enough to hold the largest possible datagram.
std::vector< char > datagram ( 65535 );
// Create an error code object to hold the error code if an error occurs.
Udpcap::Error error = Udpcap::Error::OK;
// Receive a datagram from the Socket. This is a blocking
// operation. The operation will return once a datagram has been received,
// the socket was closed by another thread or an error occured.
size_t num_bytes = socket. receiveDatagram (datagram. data (), datagram. size (), error);
// Resize the buffer to the actual size of the received datagram.
datagram. resize (num_bytes);
std::cout << " Received " << datagram. size () << " bytes: "
<< std::string (datagram. data (), datagram. size ())
<< std::endl;
}
return 0 ;
}
ستحتاج إلى git-for-windows أو Visual Studio 2015 أو إصدار أحدث وCMake 3.13 أو إصدار أحدث لتجميع Udpcap.
استنساخ هذا الريبو
(بدلاً من ذلك، يمكنك تنزيل هذا الريبو كأرشيف. لا توجد وحدات فرعية.)
git clone https://github.com/eclipse-ecal/udpcap.git
cd udpcap
اتصل بـ CMakeWindows.bat
سيؤدي هذا أيضًا إلى تنزيل التبعيات التالية:
.lib
ثنائية).lib
ثنائية) افتح _build/udpcap.sln
باستخدام Visual Studio وقم بتجميع udpcap
والعينات
لرؤية بعض المخرجات من العينات، من الواضح أنه سيتعين عليك دائمًا تنفيذ كل من نموذج المرسل snd udpcap_reciever.
يمكنك ضبط خيارات CMake التالية للتحكم في كيفية إنشاء Udpcap:
خيار | يكتب | تقصير | توضيح |
---|---|---|---|
UDPCAP_BUILD_SAMPLES | BOOL | ON | قم ببناء عينات Udpcap (و asio) لإرسال واستقبال البيانات الوهمية |
UDPCAP_BUILD_TESTS | BOOL | OFF | بناء اختبارات udpcap GTests. يتطلب توفر GTest::GTest. |
UDPCAP_THIRDPARTY_ENABLED | BOOL | ON | تنشيط/إلغاء تنشيط استخدام التبعيات المتكاملة. |
UDPCAP_THIRDPARTY_USE_BUILTIN_NPCAP | BOOL | ON | جلب وبناء على إصدار متكامل من npcap SDK. متاح فقط إذا كان UDPCAP_THIRDPARTY_ENABLED=ON |
UDPCAP_THIRDPARTY_USE_BUILTIN_PCAPPLUSPLUS | BOOL | ON | جلب وبناء على نسخة متكاملة من Pcap++. متاح فقط إذا كان UDPCAP_THIRDPARTY_ENABLED=ON |
UDPCAP_THIRDPARTY_USE_BUILTIN_ASIO | BOOL | ON | جلب وبناء على نسخة متكاملة من asio. متاح فقط إذا كان UDPCAP_THIRDPARTY_ENABLED=ON |
UDPCAP_THIRDPARTY_USE_BUILTIN_GTEST | BOOL | ON | جلب وبناء الاختبارات مقابل إصدار محدد مسبقًا من GTest. في حالة التعطيل، يجب توفير الأهداف خارجيًا. متاح فقط إذا كان UDPCAP_THIRDPARTY_ENABLED=ON و UDPCAP_BUILD_TESTS=ON |
UDPCAP_LIBRARY_TYPE | STRING | يتحكم في نوع مكتبة Udpcap عن طريق إدخال السلسلة في استدعاء add_library . يمكن ضبطها على STATIC / SHARED / OBJECT. إذا تم تعيينه، فسيتجاوز هذا خيار BUILD_SHARED_LIBS CMake العادي. إذا لم يتم تعيينه، فسيستخدم CMake الإعداد الافتراضي، والذي يتم التحكم فيه بواسطة BUILD_SHARED_LIBS . |
التكامل كثنائيات :
قم بتنزيل إصدار udpcap أو قم بإنشائه كما هو موضح سابقًا. إذا قمت ببناء الإصدار بنفسك، فتأكد من إنشاء إصدار التصحيح والإصدار وتثبيته.
إذا اخترت مكتبة udpcap المشتركة (-> .dll
)، فستكون قائمة بذاتها وتحتاج فقط إلى نسخ udpcap.dll
/ udpcapd.dll
إلى دليل التطبيق الخاص بك.
إذا اخترت مكتبة udpcap الثابتة (-> .lib
)، فستحتاج إلى إتاحة الأهداف التالية لـ CMake أيضًا:
pcapplusplus::pcapplusplus
npcap::npcap
تحقق من نموذج تكامل Udpcap للحصول على اقتراح حول كيفية القيام بذلك. يمكنك العثور على البرامج النصية والوحدات النمطية لجلب والعثور على Npcap وPcap++ هنا:
أضف دليل udpcap إلى CMAKE_PREFIX_PATH
الخاص بك:
cmake your_command_line -DCMAKE_PREFIX_PATH=path/to/udpcap/install/dir
التكامل كمصدر
اجعل مصدر udpcap متاحًا في كلتا الحالتين. يمكنك على سبيل المثال تنزيله يدويًا أو استخدام وحدة git الفرعية أو استخدام CMake FetchContent.
أضف ما يلي إلى CMakeLists.txt
الخاص بك:
# You will probably not need the samples, so turn them off.
set (UDPCAP_BUILD_SAMPLES OFF )
# Add the top-level directory as cmake subdirectory
add_subdirectory ( "path_to_udpcap" )
# Add the dummy Findudpcap.cmake do the module path to make
# find_package(udpcap) succeed.
list ( APPEND CMAKE_MODULE_PATH "path_to_udpcap/thirdparty/udpcap/Modules" )
يمكنك الآن الارتباط بـ udpcap::udpcap