Carambolas เป็นห้องสมุดสนับสนุนวัตถุประสงค์ทั่วไปที่พัฒนาขึ้นตลอดเวลาประกอบด้วยชุดประกอบ. NET Standard 2.0 หลายชุด โดยเฉพาะอย่างยิ่ง มันมีการใช้งานโปรโตคอล UDP แบบหลายช่องทางแบบกำหนดเองที่กำหนดเองสำหรับแอพพลิเคชั่นเครือข่ายผลิตภัณฑ์ที่ล่าช้าในการแฝงต่ำ -
การเปิดตัวครั้งแรกเป็นแกนกลางที่มีโมดูลเครือข่ายที่ใช้งานได้อย่างสมบูรณ์ ที่เก็บนี้มีโครงสร้างรอบ ๆ โซลูชันเดียวเพราะฉันวางแผนที่จะขยายโดยการเพิ่มโมดูลใหม่ในอนาคต
ความครอบคลุมการทดสอบยังคงน้อยที่สุดดังนั้นจึงไม่ควรมีความถูกต้องในระดับที่ไม่ควรตรวจสอบโดยไม่ต้องตรวจสอบซอร์สโค้ดอย่างใกล้ชิด นี่เป็นโครงการที่กำลังดำเนินอยู่ในระยะแรก
จะมีไบนารีเร็ว ๆ นี้ในส่วนเก็บถาวรหรือในรูปแบบของแพ็คเกจ NUGET
โฮสต์ท้องถิ่น แสดงด้วยอินสแตนซ์ของ carambolas.net.host จะต้องใช้เพื่อเชื่อมต่อกับโฮสต์ระยะไกลหรือยอมรับการเชื่อมต่อที่เข้ามา
โฮสต์ระยะไกล ทุกแห่งจะแสดงด้วยอินสแตนซ์ของ carambolas.net.peer
เหตุการณ์เช่นการเชื่อมต่อการขาดการเชื่อมต่อและข้อมูลจะได้รับผ่านวัตถุโฮสต์ในขณะที่วัตถุเพียร์อาจถูกใช้เพื่อส่งข้อมูลหรือตัดการเชื่อมต่ออย่างแข็งขัน
ณ จุดนี้เชื่อมต่อตัดการเชื่อมต่อส่งและรับการดำเนินงานจะไม่ปิดกั้น เปิดและปิดคือการปิดกั้น (ด้วยเหตุผลที่ชัดเจน)
โปรดทราบว่าวัตถุโฮสต์เดียวกันอาจถูกใช้เพื่อร้องขอการเชื่อมต่ออย่างแข็งขันและยอมรับการเชื่อมต่อที่เข้ามาทั้งหมดเดียวกันทั้งหมดซึ่งทำให้สามารถใช้งานได้ในทอพอโลยี P2P บทบาทไคลเอนต์/เซิร์ฟเวอร์ไม่ได้ถูกบังคับใช้และเกิดขึ้นได้ง่ายๆโดยการกำหนดค่าโฮสต์ โฮสต์อาจส่งคำขอการเชื่อมต่อไปยังโฮสต์ระยะไกลหลายตัวพร้อมกัน
ตัวอย่าง :
โฮสต์วัตถุอินสแตนซ์เพื่อเชื่อมต่อกับเพื่อนระยะไกล วงในมีหน้าที่รับผิดชอบเพื่อให้แน่ใจว่าเหตุการณ์จะไม่สะสมไปสู่การทำซ้ำครั้งต่อไป
using ( var host = new Host ( "MyHost" )
{
host . Open ( IPEndPoint . Any , new Host . Settings ( 0 ) ) ;
host . Connect ( new IPEndPoint ( IPAddress . Loopback , 1313 ) , out Peer peer ) ;
.. .
while ( true )
{
while ( host . TryGetEvent ( out Event e ) )
{
if ( e . EventType == EventType . Data )
Console . WriteLine ( $ "DATA: { e . Peer } { e . Data } " ) ;
else if ( e . EventType == EventType . Connection )
Console . WriteLine ( $ "CONNECTED: { e . Peer } " ) ;
else if ( e . EventType == EventType . Disconnection )
{
Console . WriteLine ( $ "DISCONNECTED: { e . Peer } { e . Reason } " ) ;
return ;
}
}
Thread . Sleep ( 33 ) ;
}
}โฮสต์วัตถุอินสแตนซ์เพื่อรอการเชื่อมต่อที่เข้ามาถึง 10 ครั้ง วงในมีหน้าที่รับผิดชอบเพื่อให้แน่ใจว่าเหตุการณ์จะไม่สะสมไปสู่การทำซ้ำครั้งต่อไป
using ( var host = new Host ( "MyHost" )
{
host . Open ( new IPEndPoint ( IPAddress . Loopback , 1313 ) , new Host . Settings ( 10 ) ) ;
.. .
while ( true )
{
while ( host . TryGetEvent ( out Event e ) )
{
if ( e . EventType == EventType . Data )
Console . WriteLine ( $ "DATA: { e . Peer } { e . Data } " ) ;
else if ( e . EventType == EventType . Connection )
Console . WriteLine ( $ "CONNECTED: { e . Peer } " ) ;
else if ( e . EventType == EventType . Disconnection )
{
Console . WriteLine ( $ "DISCONNECTED: { e . Peer } { e . Reason } " ) ;
return ;
}
}
Thread . Sleep ( 33 ) ;
}
} โครงการนี้มีอายุย้อนไปถึงปี 2558 เมื่อฉันมาแคนาดาเพื่อศึกษาการออกแบบและพัฒนาวิดีโอเกมที่โรงเรียนภาพยนตร์โตรอนโต แรงจูงใจดั้งเดิมคือการสร้างการรวบรวมคลาสอุปกรณ์เสริมที่สามารถนำกลับมาใช้ใหม่ในโครงการ Unity3D หลายโครงการ หลังจากนั้นไม่นานฉันก็เริ่มค้นคว้าโซลูชั่นเครือข่ายสำหรับเกมผู้เล่นหลายคนที่คาดหวังและโฟกัสเปลี่ยนไปสู่การออกแบบโมดูลเครือข่ายที่ใช้ซ้ำได้ ในขั้นต้นฉันเข้าหาปัญหาเป็นเรื่องง่าย ๆ ในการรวม UNET หรือห้องสมุดบุคคลที่ 3 ที่เหมาะสมอื่น ๆ ที่ฉันสามารถหาได้ในเวลานั้น หลังจากนั้นไม่นานฉันก็เริ่มชนกับปัญหาทุกประเภทตั้งแต่สมมติฐานที่แตกหักไปจนถึงการดำเนินการที่ซ่อนอยู่ ไม่ใช่เรื่องแปลกที่จะหารายการคุณสมบัติที่สูงเกินจริง โดยเฉพาะอย่างยิ่งสิ่งที่รบกวนฉันมากที่สุดคือหลายแง่มุมของการแก้ปัญหาดูเหมือนจะสุ่มโดยพลการโดยไม่ต้องอธิบายว่าทำไมวิธีการนั้นจึงเป็นที่ต้องการหรือมีข้อ จำกัด ที่กำหนด ฉันจะใช้เวลาหลายชั่วโมงในการตรวจสอบแหล่งที่มาของโครงการจดบันทึกเพื่อหาว่าทำไมบางสิ่งบางอย่างจึงเป็นวิธีที่จะตระหนักในภายหลังว่าอีกส่วนหนึ่งของรหัสอยู่ในความขัดแย้งโดยตรง
ทั้งหมดนี้ทำให้ฉันทำงานมากขึ้นและในที่สุดฉันก็ตัดสินใจที่จะสร้างห้องสมุดเครือข่ายที่มีน้ำหนักเบาด้วยตัวเองด้วยรายการคุณสมบัติที่สมเหตุสมผลที่ฉันสามารถนำไปใช้และตรวจสอบได้ ไม่เร่งด่วนไม่มีกำหนดเวลา เพียงความพยายามอย่างแท้จริงในการใช้โซลูชันทางเทคนิคที่ดีที่สุดที่ฉันสามารถคิดได้
ในขณะเดียวกันฉันจบการศึกษากลับไปทำงานเต็มเวลาและต้องจัดทำโครงการนี้ หนึ่งปีที่ผ่านมาหลังจากค้นหาโน้ตเก่า ๆ ฉันได้คืนค่าเก็บถาวรของต้นแบบและตัดสินใจที่จะรวบรวมข้อมูลที่ครอบคลุมด้วยข้อมูลทั้งหมดที่ฉันรวบรวมไว้เพื่อไม่เพียง แต่คนอื่น ๆ เท่านั้นที่สามารถทดลองได้ แต่ยังเข้าใจวิธีการทำงานและทำไม
แอสเซมบลีที่มีการจัดการสามารถสร้างขึ้นในแพลตฟอร์มใด ๆ ด้วยคอมไพเลอร์ที่รองรับ C# 7.3 หรือสูงกว่า การทดสอบและแอปพลิเคชันอุปกรณ์เสริมต้องใช้ Netcore 2.2
ห้องสมุดพื้นเมืองสามารถสร้างได้โดยใช้ CMake กับ GCC หรือ Visual Studio
เวอร์ชันระบบปฏิบัติการที่รองรับ:
สำหรับแพลตฟอร์มอื่น ๆ หรือในกรณีที่ไม่มีห้องสมุดพื้นเมืองที่ต้องการรหัสทางเลือกนั้นมีอยู่ว่าแม้ว่าโดยทั่วไปอาจมีประสิทธิภาพน้อยกว่าจะต้องใช้งานได้อย่างสมบูรณ์และโปร่งใส
โครงการ C# ทั้งหมดและสคริปต์สร้างได้รับการกำหนดค่าให้จัดเก็บไฟล์ระดับกลางและไบนารีภายใต้โฟลเดอร์ บิล ด์ที่อยู่ที่รูทโครงการเพื่อให้สามารถตรวจสอบได้อย่างง่ายดายตรวจสอบและทำความสะอาดได้อย่างง่ายดาย
รหัสใช้ dllimport เพื่อผูกไลบรารีดั้งเดิม DlliMport อาจใช้ชื่อไลบรารี Windows และจะเพิ่มคำนำหน้า/คำต่อท้ายของแพลตฟอร์มอื่น ๆ โดยอัตโนมัติตามที่ต้องการ ตัวอย่างเช่น carambolas.net.native.dll ชื่อของไลบรารีเน็ตใน Windows กลายเป็น libcarambolas.net.native.dll.so บน linux และ libcarambolas.net.native.dll.dynlib บน macos สร้างสคริปต์สร้างไลบรารีภายใต้ชื่อที่เหมาะสมแล้ว
โซลูชัน Visual Studio รวมอยู่ในความสะดวกดังนั้นจึงไม่จำเป็นต้องมีขั้นตอนการสร้างเพิ่มเติมสำหรับ Windows ตรวจสอบให้แน่ใจว่าได้เลือกแพลตฟอร์มที่สอดคล้องกับระบบปฏิบัติการโฮสต์ของคุณเท่านั้น (X86 หรือ X64) สิ่งนี้จำเป็นสำหรับการสร้างแอปพลิเคชันทดสอบและสำหรับการทดสอบหน่วย แอสเซมบลี. NET ทั้งหมดถูกสร้างขึ้นสำหรับ AnyCPU โดยไม่คำนึงถึงแพลตฟอร์มโซลูชันที่เลือก แต่ Visual Studio ต้องรู้ว่าไลบรารีพื้นเมืองที่จะสร้างสำหรับการทดสอบตามที่คาดว่าจะถูกนำไปใช้กับชุดประกอบที่เกี่ยวข้อง
ใช้ nugetpack.bat เพื่อรวบรวมไลบรารีดั้งเดิมและแอสเซมบลีแบบพกพาและสร้างแพ็คเกจ NUGET ทั้งหมดในการกระทำเดียว
ใช้ build.bat เพื่อสร้างโครงการทั้งหมดเพื่อวางจำหน่ายโดยไม่ต้องใช้ Visual Studio
Visual Studio สำหรับ Mac ยังไม่ได้รับการทดสอบและไม่ได้รับการสนับสนุนดังนั้นอย่าคาดหวังว่ามันจะทำงานได้
ตรวจสอบให้แน่ใจว่ามี cmake (> = 2.8) และ GCC เพื่อให้สามารถรวบรวมไลบรารีดั้งเดิมได้ ต้องใช้ Dotnet Core SDK 2.1 เพื่อรวบรวมชุดประกอบและสร้างแพ็คเกจ NUGET
ใช้ nugetpack.sh เพื่อรวบรวมไลบรารีดั้งเดิมและแอสเซมบลีแบบพกพาและสร้างแพ็คเกจ NUGET ทั้งหมดในการกระทำเดียว
ใช้ build.sh เพื่อสร้างโครงการทั้งหมดเพื่อวางจำหน่ายโดยไม่ต้องใช้ Visual Studio
ตรวจสอบให้แน่ใจว่ามี cmake (> = 2.8), การสร้างที่จำเป็นและ GCC-multilib ที่ติดตั้งเพื่อให้สามารถรวบรวมไลบรารีดั้งเดิมสำหรับทั้ง X86 และ X64
บน Ubuntu Run: $ sudo apt-get ติดตั้ง build-essential gcc-multilib g ++-multilib cmake
ต้องใช้ Dotnet Core SDK 2.1 เพื่อรวบรวมชุดประกอบและสร้างแพ็คเกจ NUGET
บน Ubuntu Run:
$ wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get update;
sudo apt-get install -y apt-transport-https &&
sudo apt-get update &&
sudo apt-get install -y dotnet-sdk-2.1
ใช้ nugetpack.sh เพื่อรวบรวมไลบรารีดั้งเดิมและแอสเซมบลีแบบพกพาและสร้างแพ็คเกจ NUGET ทั้งหมดในการกระทำเดียว
ใช้ build.sh เพื่อสร้างโครงการทั้งหมดเพื่อวางจำหน่ายโดยไม่ต้องใช้ Visual Studio
ชุดการทดสอบหน่วยขั้นต่ำจะถูกนำไปใช้กับคุณสมบัติที่สำคัญโดยใช้โครงการ XUNIT
carambolas.net.tests.host เป็นแอปพลิเคชั่นคอนโซลอย่างง่ายที่ใช้ในการตรวจสอบฟังก์ชั่นเครือข่ายพื้นฐานด้วยตนเอง มันมีประโยชน์เป็นพิเศษเมื่อเข้าข้าง Wireshark และง่วง
carambolas.net.tests.integration เป็นชุดของการทดสอบการรวมสำหรับ carambolas.net ยังใช้กับ XUNIT การทดสอบรันตามลำดับแต่ละเธรดที่เริ่มต้นแยกกันสองตัว (เซิร์ฟเวอร์และไคลเอนต์) ซึ่งสื่อสารผ่านอินเตอร์เฟส loopback ในระยะเวลาที่กำหนด Loopback แสดงถึงเครือข่ายในอุดมคติที่เวลาการเดินทางไปกลับอย่างน้อยแพ็กเก็ตไม่เคยออกคำสั่งและจะไม่หายไปเว้นแต่จะมีบัฟเฟอร์ล้น ลักษณะเหล่านี้มีประโยชน์ในการตรวจสอบเส้นทางการดำเนินการปกติ
Wireshark เป็นเครื่องมือการดีบักที่มีค่าซึ่งสามารถใช้ในการตรวจสอบกิจกรรมเครือข่ายและตรวจสอบแพ็คเก็ต นอกจากนี้ Wireshark ยังรองรับปลั๊กอินประเภทพิเศษที่เรียกว่า dissectors ที่สามารถใช้ในการวิเคราะห์โปรโตคอลที่กำหนดเอง
โครงการนี้รวมถึง dissector wireshark พื้นฐานสำหรับ carambolas ในการใช้งานตรวจสอบให้แน่ใจว่ามีการติดตั้ง Wireshark แล้ว
CLUMSY เป็นโปรแกรมจับแพ็กเก็ตเครือข่ายที่ทำงานในโหมดผู้ใช้และมีความสามารถในการสกัดกั้นแพ็คเก็ตเพื่อจำลองสภาพเครือข่ายที่เสื่อมโทรมในเวลาจริง
เพิ่มบรรทัดตัวกรองล่วงหน้าเช่นต่อไปนี้ในไฟล์ config.txt เพื่อส่งผลกระทบต่อโฮสต์ที่เชื่อมต่อโดยอินเตอร์เฟส loopback ในพอร์ตเดียวกับที่ใช้ในการทดสอบการรวม (1313):
carambolas: udp and outbound and loopback and (udp.DstPort == 1313 or udp.SrcPort == 1313)
โปรดทราบว่ามีข้อแม้สองสามข้อเมื่อใช้งุ่มง่ามกับอินเทอร์เฟซวนรอบ จากคู่มือผู้ใช้ที่ซุ่มซ่าม:
- แพ็คเก็ตขาเข้าแบบวนกลับไม่สามารถจับหรือนำกลับมาใช้ใหม่ได้ เมื่อคุณคิดเกี่ยวกับมันมันยากมากที่จะบอกว่ามันเป็นแพ็คเก็ตขาเข้าหรือขาออกเมื่อคุณส่งแพ็กเก็ตจากคอมพิวเตอร์ไปยังตัวเอง ในความเป็นจริงแพลตฟอร์มการกรอง Windows พื้นฐานดูเหมือนว่าจะจำแนกแพ็คเก็ต loopback ทั้งหมดเป็นขาออก สิ่งที่ต้องจำไว้คือเมื่อคุณกำลังประมวลผลบนแพ็กเก็ตลูปแบ็คคุณจะไม่สามารถ "ขาเข้า" ในตัวกรองของคุณได้ สิ่งสำคัญคือต้องรู้ว่าคอมพิวเตอร์ของคุณอาจมี IPS นอกเหนือจาก 127.0.0.1 เช่น IP อินทราเน็ตที่จัดสรรโดยเราเตอร์ของคุณ สิ่งเหล่านี้ถือว่าเป็นแพ็คเก็ตแบบวนกลับ
- แพ็คเก็ตลูปแบ็คถูกจับสองครั้ง เนื่องจากเราไม่มีแพ็คเก็ต loopback ขาเข้าแพ็คเก็ต loopback ทั้งหมดจึงถือว่าเป็นขาออก ดังนั้นเงอะงะจะประมวลผลพวกเขาสองครั้ง: ครั้งแรกคือเมื่อส่งและครั้งที่สองเมื่อได้รับ ตัวอย่างง่ายๆคือเมื่อตัวกรองเป็นเพียง "ขาออก" และใช้ความล่าช้า 500ms เมื่อคุณ ping localhost มันจะล่าช้า 1,000ms คุณสามารถแก้ไขได้โดยระบุพอร์ตปลายทางและสิ่งต่าง ๆ เช่นนี้ แต่มันจะง่ายกว่าที่จะจำไว้และระวังเมื่อตั้งค่าพารามิเตอร์
- การจับแพ็คเก็ตขาเข้าไม่ทำงานตลอดเวลา ตามที่ระบุไว้ก่อนหน้านี้แพ็คเก็ตขาเข้าแบบวนกลับไม่สามารถนำกลับมาใช้ใหม่ได้ ปัญหาคือในบางครั้งแพ็คเก็ตบางตัวอาจจัดเป็นแพ็คเก็ตขาเข้าแม้ว่า IP ปลายทางจะไม่ได้อยู่ในคอมพิวเตอร์ของคุณ สิ่งนี้มีผลต่อแพ็คเก็ตที่ไม่ใช่ลูปแบ็คเท่านั้น หากคุณกำลังทำงานกับ LocalHost เท่านั้นมันจะดี เป้าหมายของการเปิดตัวในอนาคตคือการวินิจฉัยสิ่งที่เกิดขึ้นและให้ทางออก
- ไม่สามารถกรองตามการจับเครือข่ายระบบกว้างของระบบกระบวนการแสดงเป็นคุณสมบัติ แต่จริงๆแล้วนี่เป็นเพราะไม่มีวิธีง่ายๆในการแก้ปัญหาที่แข็งแกร่ง
ฉันมักจะเปิดรับการสนับสนุนไม่ว่าจะเป็นในรูปแบบของรายงานข้อผิดพลาดการแก้ไขข้อบกพร่อง (ดีกว่า!) หรือปรับปรุงการทดสอบการทดสอบ
ยินดีต้อนรับการร้องขอคุณสมบัติ แต่อาจถูกเก็บไว้ในงานในมือขึ้นอยู่กับว่าพวกเขามีความกว้างขวางเป็นไปได้หรือเป็นที่ต้องการ หากคำขอคุณสมบัติมีความซับซ้อนเกินไปอาจขึ้นอยู่กับการสนับสนุนเนื่องจากฉันมีทรัพยากร จำกัด (เวลาและเงิน) เพื่ออุทิศ
หากคุณต้องการสนับสนุนโครงการนี้ฉันอาจสนใจที่จะได้ยินจากคุณดังนั้นเอื้อมมือออกไป!
ในโปรตุเกส Carambolas เป็นรูปแบบพหูพจน์ของ Carambola (= Starfruit) คำนี้ยังใช้ในการเรียกขานในบางภูมิภาคของบราซิลเพื่อแสดงความประหลาดใจหรือความอดทน
ก่อนที่ Carambolas ฉันพยายามอย่างน้อยครึ่งโหลเพื่อจัดระเบียบความคิดของฉันในโครงการที่ใช้งานได้ ด้วย Carambolas ฉันตัดสินใจที่จะสร้างชุดต้นแบบเพื่อเรียนรู้เกี่ยวกับปัญหาการออกแบบและทดสอบวิธีการที่แตกต่างกัน ต้นแบบแต่ละตัวมีชื่อรหัสที่เกิดขึ้นจากตัวอักษรและตัวเลขเริ่มต้นที่ A1 ซอร์สโค้ดที่นำเข้าครั้งแรกในที่เก็บนี้คือการทำซ้ำครั้งที่ 75 ของต้นแบบที่ 9 ดังนั้น A9
ห้องสมุดพื้นเมืองส่วนใหญ่มีเหตุผลด้านประสิทธิภาพดังนั้นจึงเป็นทางเลือกโดยสิ้นเชิง มันคงไม่มีเหตุผลที่จะพยายามจัดให้มีการใช้งานดั้งเดิมสำหรับทุกแพลตฟอร์มที่เป็นไปได้ (คิดเกี่ยวกับเดสก์ท็อปทั้งหมดมือถือคอนโซลฝังตัว ... ) และพึ่งพาห้องสมุดพื้นเมืองทั้งหมดจะลดแพลตฟอร์มเป้าหมายให้เป็นเพียงไม่กี่เดสก์ท็อปเท่านั้น (Windows, Linux และ MacOS) ดังนั้นตามกฎของหัวแม่มือจะต้องมีการใช้งานทางเลือกในรหัสที่มีการจัดการสำหรับฟังก์ชั่นการใช้งานใด ๆ ที่ดำเนินการโดยไลบรารีดั้งเดิม
เนื่องจากไลบรารีดั้งเดิมเป็นทางเลือกโปรแกรมจึงไม่สามารถบอกได้ว่าไฟล์ที่หายไปควรจะอยู่ที่นั่นหรือไม่ดังนั้นเหตุใดจึงไม่มีข้อผิดพลาดที่ถูกโยนทิ้งหรือบันทึกไว้สำหรับไลบรารีดั้งเดิมที่หายไป ตามคำนิยามไลบรารีเนทีฟที่หายไปนั้นไม่เคยเป็นข้อผิดพลาด
โดยทั่วไปคุณทำไม่ได้ และอย่างน้อยคุณก็ไม่ควรมาจากมุมมอง API ไม่ควรมีความสำคัญต่อผู้ใช้ (หรือโปรแกรมเมอร์แอพ) ว่ากลยุทธ์การใช้งานพื้นฐานที่ใช้โดยการพึ่งพาอาศัยกันในกรณีนี้ Carambolas อย่างไรก็ตามข้อมูลนี้อาจเกี่ยวข้องกับการปรับใช้ดังนั้นทุกครั้งที่มีการสร้างวัตถุ interop ซึ่งมีการย้อนกลับอัตโนมัติรหัสจะสร้างข้อมูลบันทึกที่บ่งบอกถึง ตัวอย่างเช่น carambolas.net.socket จะสร้างข้อมูลบันทึกคล้ายกับ "การใช้ carambolas.net.sockets.native.socket" เมื่อพบไลบรารีดั้งเดิมสำหรับการใช้งานซ็อกเก็ตพื้นฐาน ด้วยวิธีนี้หากคุณใช้งานกับห้องสมุดพื้นเมืองในใจคุณสามารถพิจารณาได้ว่าพวกเขากำลังใช้จริงหรือไม่
ซึ่งหมายความว่าคุณกำลังปรับใช้ไลบรารีดั้งเดิมที่เสียหายหรือรวบรวมไว้สำหรับสถาปัตยกรรม CPU ที่ไม่ถูกต้อง
ห้องสมุดพื้นเมืองจะต้องไปเคียงข้างกันกับชุดประกอบระหว่างกันที่สอดคล้องกันและแม้ว่าแอสเซมบลีอาจจะถูกรวบรวมหนึ่งครั้งสำหรับสถาปัตยกรรม CPU ใด ๆ ห้องสมุดพื้นเมืองไม่สามารถทำได้ พวกเขาจะต้องตรงกับสถาปัตยกรรม CPU ของระบบปฏิบัติการที่กำลังทำงานมิฉะนั้นพวกเขาจะถือว่าเป็นไฟล์ที่เสียหายและ. NET โยน System.BadimageFormatexception โปรดทราบว่านี่ไม่เหมือนกับการพยายามโหลดไลบรารีที่ไม่พบซึ่งเป็นคำจำกัดความไม่ใช่ข้อผิดพลาด
ผลิตภัณฑ์แบนด์วิดธ์-ล่าช้า (BDP) เป็นผลิตภัณฑ์ของความสามารถในการส่งสัญญาณของเครือข่ายลิงค์ (เป็นบิตต่อวินาที) และเวลาหน่วงเวลาไปกลับ (ในวินาที) มันแสดงถึงจำนวนข้อมูลสูงสุดที่เครือข่ายสามารถรักษาไว้ก่อนที่จะได้รับการตอบรับใด ๆ
BDP สามารถใช้ในการจำแนกเครือข่ายตามไม่ว่าจะสูงกว่าหรือต่ำกว่าเกณฑ์ที่แน่นอน เครือข่ายที่มี BDP ขนาดใหญ่เรียกว่าเครือข่ายไขมันยาว (LFNs) LFNs อาจเป็นเครือข่ายที่มีเวลาเดินทางไปกลับโดยเฉลี่ย (regadless ของแบนด์วิดท์เช่นเดียวกับในลิงก์ดาวเทียม) หรือเครือข่าย (แบนด์วิดท์สูง) ที่กว้างซึ่งแสดงเวลาการเดินทางไปกลับขนาดเล็กมาก (เช่นเดียวกับลิงค์ Gigabit Ethernet)
ตรวจสอบ Wikipedia สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้
วัตถุ carammbolas.net.socket ทำหน้าที่เป็นส่วนประกอบของการใช้งานซ็อกเก็ตดั้งเดิมหรือการใช้งานทางเลือกที่ขึ้นอยู่กับ System.net.sockets.socket ช่วยแยกและลดความซับซ้อนของโฮสต์และวัตถุเพียร์ อ้างถึง Doc/Readme-carambolas.net สำหรับข้อมูลเพิ่มเติม
System.net.ipaddress และ System.net.ipendpoint เป็นวัตถุที่ไม่แน่นอนซึ่งส่งเสริมการจัดสรรที่ไม่จำเป็นจำนวนมากในการดำเนินการในปัจจุบันทั้งหมดของ. NET Core และ. NET Framework carambolas.net.ipaddress และ carambolas.net.ipendpoint เป็นประเภทค่าที่ไม่เปลี่ยนรูปซึ่งช่วยลดแรงดัน GC อ้างถึง Doc/Readme-carambolas.net สำหรับข้อมูลเพิ่มเติม
AEAD กับ Chacha20 และ Poly1305 ได้รับการสนับสนุนนอกกรอบ กลยุทธ์ที่กำหนดเองอาจดำเนินการได้โดยการจัดหาโฮสต์ด้วยการใช้งานของ carambolas.net.cipricher และ carambolas.net.ciperhactory อินเตอร์เฟส ข้อกำหนดเดียวคือ:
แอปพลิเคชันผู้ใช้มีอิสระที่จะบีบอัดข้อมูลก่อนที่จะส่ง แต่ขณะนี้ไม่มีกลไกที่จะให้การบีบอัด/การบีบอัดอัตโนมัติของข้อความแต่ละข้อความหรือแพ็คเก็ตที่สมบูรณ์
ซอร์สโค้ดทั้งหมดและไบนารีใด ๆ ที่สร้างขึ้นเพื่อปรับใช้ควบคู่ไปกับแอปพลิเคชันผู้ใช้ได้รับอนุญาตภายใต้ใบอนุญาต MIT
Carambolas.CommandLineArguments มีพื้นฐานมาจากบทความโดย Griffonrl พร้อมซอร์สโค้ดที่เผยแพร่ภายใต้ใบอนุญาต MIT พร้อมแนวคิดเพิ่มเติมจากบทความอื่นโดย Jake Ginnivan ที่ขยายตัวในแหล่งดั้งเดิม
carambolas.security.criptography.crc32c ขึ้นอยู่กับ crc32.net โดยการบังคับภายใต้ใบอนุญาต MIT
carambolas.security.criptography.naCl มีพื้นฐานมาจากและขยายใน NaCl.core โดย David de Smet ภายใต้ใบอนุญาต MIT
ตัวแยกโปรโตคอลที่เขียนใน Lua สำหรับ Wireshark มีให้ภายใต้ใบอนุญาต GPLV3 มันควรจะใช้เป็นไฟล์อินพุตสำหรับ Wireshark เพื่อขยายความสามารถของมันและอนุญาตให้แสดงข้อมูลเพิ่มเติมเกี่ยวกับแพ็กเก็ต UDP ที่จัดรูปแบบตามโปรโตคอลเครือข่าย Carambolas ดังนั้นจึงแยกจากกันโดยสิ้นเชิงและไม่โต้ตอบขึ้นอยู่กับหรือมีส่วนร่วมในทุก ๆ ด้านกับไฟล์แหล่งที่มาประกอบหรือไลบรารีดั้งเดิม