วีดีโอ: การเชื่อมต่อถูกบล็อกหรือไม่?
2024 ผู้เขียน: Lynn Donovan | [email protected]. แก้ไขล่าสุด: 2023-12-15 23:54
เชื่อมต่อ คือ การปิดกั้น โดยค่าเริ่มต้น แต่คุณสามารถทำให้ไม่ใช่ การปิดกั้น โดยผ่านไปยังซ็อกเก็ตแฟล็ก SOCK_NONBLOCK เชื่อมต่อ () บล็อกจนกว่าจะเสร็จสิ้นการจับมือ TCP 3-way การจับมือกันทางด้านการรับฟังถูกจัดการโดย TCP/IP stack ในเคอร์เนลและเสร็จสิ้นโดยไม่แจ้งให้ผู้ใช้ทราบ
ในทำนองเดียวกันจะถามว่าอะไรคือบล็อกและไม่บล็อกซ็อกเก็ต?
ใน การปิดกั้น โหมด, recv, ส่ง, เชื่อมต่อ (TCP เท่านั้น) และยอมรับ (TCP เท่านั้น) เบ้า การเรียก API จะ บล็อก ไปเรื่อย ๆ จนกว่าจะได้ดำเนินการตามที่ร้องขอ ใน ไม่ใช่ - การปิดกั้น โหมด ฟังก์ชันเหล่านี้จะกลับมาทันที เลือก will บล็อก จนกระทั่ง เบ้า พร้อมแล้ว
ฟังก์ชั่นการบล็อกคืออะไร? NS ฟังก์ชั่นการปิดกั้น โดยทั่วไปจะคำนวณตลอดไป นั่นคือสิ่งที่มันหมายถึงโดย การปิดกั้น . อื่น ฟังก์ชั่นการปิดกั้น จะรอให้ IO เกิดขึ้น ไม่ใช่ การปิดกั้น ระบบ IO หมายถึง a การทำงาน เริ่มต้นการดำเนินการ IO จากนั้นไม่ได้ใช้งาน จากนั้นจึงจัดการผลลัพธ์ของการดำเนินการ IO เมื่อมันเกิดขึ้น
ต่อมาคำถามคือ socket ยอมรับการบล็อคหรือไม่?
ยอมรับ () บล็อกผู้โทรจนกว่าจะมีการเชื่อมต่อ หากไม่มีพื้นที่ข้อความที่ เบ้า เพื่อเก็บข้อความที่จะส่ง จากนั้น send() ปกติจะบล็อก หากไม่มีข้อความที่ เบ้า , การเรียก recv จะรอให้ข้อความมาถึง
เลือกบล็อกหรือไม่?
หากอาร์กิวเมนต์การหมดเวลาชี้ไปที่อ็อบเจ็กต์ประเภท struct timeval ที่มีสมาชิกเป็น 0 เลือก () ไม่ บล็อก . หากอาร์กิวเมนต์การหมดเวลาเป็น NULL เลือก () บล็อกจนกว่าเหตุการณ์จะทำให้มาสก์ตัวใดตัวหนึ่งถูกส่งคืนด้วยค่าที่ถูกต้อง (ไม่ใช่ศูนย์)