Gần đây tôi đã bắt đầu viết một số mã C++ sử dụng ổ cắm, mà tôi muốn không đồng bộ. Tôi đã đọc nhiều bài viết về cách poll và select có thể được sử dụng để làm cho các socket của tôi không đồng bộ (sử dụng poll hoặc select để đợi một bộ đệm gửi hoặc recv), nhưng ở phía máy chủ của tôi, tôi có một mảng structffd, mỗi lần các ổ cắm nghe chấp nhận một kết nối, nó thêm nó vào mảng của struct pollfd để nó có thể theo dõi recv của socket đó (POLLIN).Có cách nào tốt hơn để sử dụng các cổng TCP không đồng bộ trong C++ thay vì thăm dò ý kiến hoặc chọn không?
Vấn đề của tôi là nếu tôi có 5000 ổ cắm được kết nối với ổ cắm nghe trên máy chủ, thì mảng pollfd sẽ có kích thước 5000, vì nó sẽ giám sát tất cả các ổ cắm được kết nối NHƯNG cách duy nhất tôi biết để kiểm tra xem một recv cho một ổ cắm đã sẵn sàng chưa, là bằng cách lặp qua tất cả các mục trong mảng của struct pollfd để tìm những cái có revents bằng POLLIN. Điều này dường như không hiệu quả, khi số lượng các ổ cắm được kết nối bởi vì rất lớn. Có cách nào tốt hơn để làm điều này?
Cách tăng :: thư viện asio xử lý async_accept, async_send, v.v ...? Tôi nên xử lý nó như thế nào?
Không có * tăng * trong [tag: c], hãy cẩn thận khi bạn chọn thẻ của mình. –
Bạn đang trộn 'không chặn' và 'không đồng bộ'. Họ là những chế độ riêng biệt. 'select()' và bạn bè dành cho I/O không bị chặn. Có vẻ như bạn cần I/O không đồng bộ, trong trường hợp này bạn nên sử dụng 'boost', hoặc chuyển sang một ngôn ngữ khác như Java có tích hợp sẵn. Nhưng chỉ với 5000 khách hàng, bạn không nên bỏ qua việc chặn I/O với chủ đề. – EJP
@EJP ... hoặc xem xét sử dụng ['std :: async()'] (http: //www.cplusplus.com/reference/future/async /) – Christophe