วีดีโอ: ซ็อกเก็ตที่ไม่ปิดกั้นคืออะไร?
2024 ผู้เขียน: Lynn Donovan | [email protected]. แก้ไขล่าสุด: 2023-12-15 23:54
ไม่ใช่ - การปิดกั้นซ็อกเก็ต . วิธีแก้ปัญหานี้เรียกว่า " ไม่ใช่ - การปิดกั้นซ็อกเก็ต " โดยค่าเริ่มต้น TCP ซ็อกเก็ต อยู่ใน " การปิดกั้น โหมด " ตัวอย่างเช่น เมื่อคุณเรียก recv() เพื่ออ่านจากสตรีม การควบคุมจะไม่ถูกส่งกลับไปยังโปรแกรมของคุณจนกว่าจะอ่านข้อมูลอย่างน้อยหนึ่งไบต์จากไซต์ระยะไกล
ดังนั้นสิ่งที่บล็อกและไม่บล็อกซ็อกเก็ตคืออะไร?
ใน การปิดกั้น โหมด, recv, ส่ง, เชื่อมต่อ (TCP เท่านั้น) และยอมรับ (TCP เท่านั้น) เบ้า การเรียก API จะ บล็อก ไปเรื่อย ๆ จนกว่าจะได้ดำเนินการตามที่ร้องขอ ใน ไม่ใช่ - การปิดกั้น โหมด ฟังก์ชันเหล่านี้จะกลับมาทันที เลือก will บล็อก จนกระทั่ง เบ้า พร้อมแล้ว
อาจมีคนถามว่าซ็อกเก็ตถูกบล็อกโดยค่าเริ่มต้นหรือไม่? โดย ค่าเริ่มต้น , TCP ซ็อกเก็ต อยู่ใน a การปิดกั้น โหมด. ซึ่งหมายความว่าตัวควบคุมจะไม่ถูกส่งกลับไปยังโปรแกรมของคุณจนกว่าการดำเนินการบางอย่างจะเสร็จสิ้น
เกี่ยวกับสิ่งนี้ คุณจะสร้างซ็อกเก็ตที่ไม่บล็อกได้อย่างไร
เพื่อทำเครื่องหมาย เบ้า เช่น ไม่ใช่ - การปิดกั้น เราใช้การเรียกระบบ fcntl นี่คือตัวอย่าง: int flags = guard(fcntl(socket_fd, F_GETFL), "could not get file flags"); guard(fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK), "ไม่สามารถ ชุด แฟล็กไฟล์");
การบล็อกซ็อกเก็ตคืออะไร?
NS เบ้า สามารถอยู่ใน " โหมดการปิดกั้น " หรือ "ไม่ปิดกั้น โหมด ." หน้าที่ของ ซ็อกเก็ต ใน การปิดกั้น (หรือซิงโครนัส) โหมด อย่ากลับมาจนกว่าพวกเขาจะสามารถดำเนินการได้เสร็จสิ้น นี้เรียกว่า การปิดกั้น เพราะว่า เบ้า ที่ฟังก์ชันถูกเรียกไม่สามารถทำอะไรได้ - ถูกบล็อก - จนกว่าการโทรจะกลับมา