2012-02-10 26 views
17

Vì vậy, câu hỏi chính của tôi ở đây là làm thế nào để thực hiện một cấu trúc trên đầu trang của tcp ASIO :: ổ cắm hoặc tcp :: iostream rằng sẽ thực hiện some kind of input-seekable filter enter image description hereTăng iostreams: Cách tạo luồng TCP (để đọc) TCP?

với đệm lên để nói 1kb?

+6

Sự cố là khó sử dụng luồng trên ổ cắm không đồng bộ. Ví dụ, bạn đọc một chuỗi từ luồng cho đến khi không có chuỗi nào trong bộ đệm. Nhưng làm thế nào bạn có thể (hoặc dòng) biết nếu nó thực sự là kết thúc của chuỗi? Phần còn lại có thể đến trong một gói khác, và không có cách nào để biết khi nào, hoặc thực sự nếu, nó sẽ được chuyển giao. –

+0

Vì tò mò bạn đã xem xét điều này? http://stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream – NothingMore

+0

@JoachimPileborg: Rất dễ dàng để biết - cho đến khi bạn đến cuối luồng hoặc lỗi trên ổ cắm. Phần còn lại là logic nghiệp vụ phụ thuộc nhiều vào giao thức cấp cao đang được sử dụng. Điều đó đang được nói, đệm là cần thiết, nhưng có C++ iostream cho đó là braindead. Libevent cung cấp API đệm mục đích chung tốt đẹp vì lý do đó. –

Trả lời

0

Tôi không quen với mô-đun tăng cường đặc biệt này. Nhưng, nếu bạn đang tìm kiếm một cách để tạo một bộ đệm hoạt động giống như một kho lưu trữ các loại, tôi sẽ tạo một luồng khác để quản lý nó. Chủ đề có thể LIFO luồng đến, xử lý các yêu cầu lọc và quản lý bộ đệm. Giữ nó trên một thread riêng biệt có nghĩa là nó sẽ chú ý đến các gói dữ liệu đến trước khi bộ đệm hệ thống chạy ra ngoài, vì vậy bạn không phải lo lắng về việc thiếu bất cứ thứ gì. Một hàng đợi tin nhắn có thể được tạo ra để dàn xếp giữa các luồng.

Điều đó nói rằng, cuối cùng, có lẽ dễ nhất là hãy nhìn vào một thư viện viết tay trước để xử lý nó và tiết kiệm cho mình một chút thời gian. Hãy xem this post.

1

Tôi nghĩ rằng một cái gì đó như "đi đến cuối dòng" sẽ không thể cho một kết nối TCP. Nếu một cuộc gọi như thế này (xem mã sau) hãy chờ (chặn) để kết nối đóng? Và làm thế nào nó nên lưu trữ các phản ứng khi nó đạt đến kích thước bộ đệm (ví dụ 1Kb)?

s.seekg (0, ios::end); 

Vì vậy, sẽ khó (/ không thể) để triển khai luồng TCP có thể tìm kiếm nói chung. Ngay cả khi bạn có bộ đệm không giới hạn (không chỉ 1Kb).

Có thể thực hiện một cái gì đó như có thể tìm kiếm đầu vào cho các giao thức cụ thể như HTTP (S) khi tiêu đề Content-Length được đặt. Nhưng cũng trong trường hợp này, bộ đệm kích thước cố định là 1Kb sẽ không hoạt động trừ khi bạn sử dụng tiêu đề Phạm vi HTTP/1.1.

Có lẽ nó sẽ giúp: Christopher M. Kohlhoff (tác giả của Boost asio) đã triển khai Urdl (được đánh dấu là 'Prealpha' trên SourceForge), nơi ông đã mô hình hóa kết nối HTTP như một dòng. Tôi nghĩ phương pháp read_some có thể thú vị với bạn: https://github.com/jnorthrup/urdl/blob/master/include/urdl/detail/http_read_stream.hpp#L426