Udpcap เป็นการจำลอง UDP-Socket แบบรับอย่างเดียวโดยยึดตาม Npcap ใช้ไดรเวอร์การจับแพ็กเก็ต Npcap เพื่อจับการรับส่งข้อมูลอีเธอร์เน็ต แยกวิเคราะห์ส่วนหัวที่จำเป็นทั้งหมด และส่งคืน UDP Payload ด้วย Udpcap คุณสามารถเปิด UDP Socket และรับข้อมูลโดยไม่ต้องเปิด Socket จริงๆ!
โครงการนี้เป็น Windows เท่านั้น เนื่องจาก Npcap กำหนดเป้าหมายเฉพาะ Windows เช่นกัน
Udpcap สามารถ :
Udpcap ไม่สามารถ :
CMake ดึงข้อมูลการอ้างอิงทั้งหมดได้อย่างสะดวก หากต้องการใช้ Udpcap จริงๆ จำเป็นต้องติดตั้งไดรเวอร์ Npcap โปรดทราบว่าใบอนุญาต Npcap เป็นกรรมสิทธิ์
การใช้ไดรเวอร์ดักจับแพ็กเก็ตเพื่อจำลองซ็อกเก็ต UDP ฟังดูเป็นความคิดที่แย่มาก เมื่อคุณสามารถใช้ซ็อกเก็ต UDP ที่เหมาะสมได้ ก็คงจะเป็นเช่นนั้น แต่เดี๋ยวก่อน มีปัญหา Windows เฉพาะเจาะจงมากซึ่งโปรเจ็กต์นี้สามารถแก้ไขได้
เมื่อเปรียบเทียบกับ Windows 7 แล้ว Windows 10 มี Windows Defender ที่ก้าวร้าวมากกว่า (บริการ MpsSvc) เมื่อได้รับแพ็ก เก็ตมัลติคาสต์ UDP จำนวนมากพร้อมซ็อกเก็ตปกติบน Windows 10 Windows Defender จะทำให้ CPU จำนวนมากโหลดทำให้ระบบทั้งหมดล่าช้า ดูเหมือนว่าปัญหาจะแย่ลงไปอีกเมื่อเครื่อง Windows เชื่อมต่อกับโดเมน Windows ดังที่มักทำในเครือข่ายองค์กรขนาดใหญ่ เมื่อตรวจสอบระบบด้วย Process Hacker เราจะเห็นว่ากระบวนการ System
(เคอร์เนล Windows) ครอบครองพื้นที่มากพอ ๆ กับแกน CPU ทั้งหมด มันเป็นหนึ่งเธรดภายในเคอร์เนลที่ใช้รอบ CPU ทั้งหมดเสมอและมี tcpip.sys
อยู่ใน call stack:
Defender Firewall ไม่สามารถปิดการใช้งานใน Windows 10 ได้อีกต่อไป บริการ MpsSvc จะยังคงทำงานต่อไปเมื่อปิดการใช้งานชั่วคราว เนื่องจากมีฟีเจอร์ความปลอดภัยเพิ่มเติมนอกเหนือจากไฟร์วอลล์ Defender
บน Windows การเข้าถึงเครือข่ายทุกรายการ (เริ่มต้นพื้นที่ผู้ใช้) จะใช้ Winsocks/2 API API นั้นใช้ไดรเวอร์ระบบไฟล์ Kernel-Mode Afd.sys
ซึ่งจากนั้นจะใช้ Transport Protocol Driver tcpip.sys
ไดรเวอร์ tcpip.sys คือจุดที่เวทมนตร์ของโปรโตคอลทั้งหมดเกิดขึ้นใน Windows นี่เป็นจุดที่ไฟร์วอลล์ Windows Defender วิเคราะห์การรับส่งข้อมูล Microsoft ได้สร้าง API ทั้งหมดเพื่อจุดประสงค์ดังกล่าวเท่านั้น: Windows Filtering Platform (WFP) API นี้มีอยู่ใน Windows Vista และใหม่กว่า ด้านล่าง tcpip.sys
มาพร้อม NDIS.sys
(ข้อกำหนดอินเทอร์เฟซไดรเวอร์เครือข่าย) และไดรเวอร์ Ethernet NIC จริงเท่านั้น ดังนั้น เพื่อแก้ไขปัญหาการโหลด CPU ของไฟร์วอลล์ Defender เราจำเป็นต้องข้ามไดรเวอร์ tcpip.sys
ทั้งหมดและทุกอย่างที่อยู่เหนือไดรเวอร์นั้น อ้างอิงถึงภาพด้านล่าง (เส้นสีดำ) เพื่อดูภาพรวม เมื่อใช้ Npcap Windows Defender จะไม่เห็นซ็อกเก็ตที่เปิดอยู่และไม่วิเคราะห์การรับส่งข้อมูล อย่างไรก็ตาม นี่หมายความว่าจะต้องมีการนำสแต็กโปรโตคอล UDP มาใช้ใหม่ในพื้นที่ผู้ใช้ (นั่นคือสิ่งที่ Udpcap มีประโยชน์!)
Udpcap มี API ที่เรียบง่ายและมีความคล้ายคลึงอย่างมากกับ SOCKET API อื่นๆ ที่รู้จักกันดี:
# 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
โคลนที่เก็บนี้
(หรืออีกวิธีหนึ่ง คุณสามารถดาวน์โหลด repo นี้เป็นไฟล์เก็บถาวรได้ ไม่มีโมดูลย่อย)
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