API socket là tiêu chuẩn thực tế cho truyền thông TCP / IP và UDP / IP (nghĩa là mã mạng như chúng ta biết). Tuy nhiên, một trong những chức năng cốt lõi của nó, accept()
là một chút ma thuật.
Để mượn một định nghĩa bán chính thức:
accept () được sử dụng ở phía máy chủ. Nó chấp nhận một nỗ lực đến nhận được để tạo kết nối TCP mới từ máy khách từ xa và tạo một ổ cắm mới được liên kết với cặp địa chỉ ổ cắm của kết nối này.
Nói cách khác, accept
trả về một ổ cắm mới thông qua đó máy chủ có thể giao tiếp với máy khách mới được kết nối. Ổ cắm cũ (trên đóaccept
được gọi) vẫn mở, trên cùng một cổng, lắng nghe các kết nối mới.
Làm thế nào để accept
làm việc? Nó được thực hiện như thế nào? Có rất nhiều nhầm lẫn về chủ đề này. Nhiều người tuyên bố chấp nhận mở một cổng mới và bạn giao tiếp với khách hàng thông qua cổng đó. Nhưng điều này rõ ràng là không đúng, vì không có cổng mới nào được mở. Bạn thực sự có thể giao tiếp qua cùng một cổng với các máy khách khác nhau, nhưng bằng cách nào? Khi một số luồng gọi recv
trên cùng một cổng, làm thế nào để dữ liệu biết đi đâu?
Tôi đoán đó là thứ gì đó dọc theo dòng địa chỉ của khách hàng được liên kết với bộ mô tả ổ cắm và bất cứ khi nào dữ liệu đi qua recv
nó được chuyển đến đúng ổ cắm, nhưng tôi không chắc chắn.
Thật tuyệt khi có được một lời giải thích kỹ lưỡng về hoạt động bên trong của cơ chế này.