2011-05-08 55 views
6

Tôi đang đọc từ một boost::asio::ip::udp::socket như thế này:động có kích thước tăng :: ASIO :: đệm

using boost::asio::ip::udp; 

// ... 

char recv_buf[128]; 
udp::endpoint sender_endpoint; 
size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint); 

Bây giờ, công trình này hoàn toàn tốt đẹp, nhưng số tiền tối đa của nhân vật mà tôi có thể nhận được tại là 127. Tuy nhiên tôi đang đối mặt với một vấn đề bởi vì tôi cần phải chấp nhận một số dữ liệu đầu vào trong đó chiều dài có thể thay đổi rất nhiều (và không phải là độ dài được xác định rõ ràng với các tiêu đề tiền tố, ví dụ). Một giải pháp cho điều này sẽ là một bộ đệm mở rộng động, giống như một vectơ. Có thể tạo ra một sự mở rộng động boost::asio::buffer để chấp nhận (lý thuyết) số lượng infite đầu vào và lưu trữ nó trong một container?

Trả lời

5

Kích thước gói dữ liệu UDP không thay đổi nhiều lắm: nó sẽ không bao giờ lớn hơn 65535, để trống 65.527 byte dữ liệu sau tiêu đề 8 byte.

+1

+1 Bạn hoàn toàn đúng! Tuy nhiên tôi sẽ quan tâm đến một 'tăng :: asio :: buffer' động, không phải vì 64KiB quá lớn, nhưng một bộ đệm động thường có vẻ thích hợp hơn nhiều, và để tái sử dụng trong TCP. – orlp

+0

@nightcracker với TCP, asio gọi trình xử lý đọc khi bộ đệm đầy, vì vậy bạn có thể dọn sạch nó và quay lại đọc. – Cubbi

0

Dường như không có bất kỳ điều khoản nào cho việc định kích thước động. Và nó có ý nghĩa rằng sẽ không có. Hãy suy nghĩ về những gì sẽ phải xảy ra:

  • Một datagram UDP đơn chỉ có thể nhận một lần, và cùng một lúc, do đó:
  • bộ đệm cho các cuộc gọi hệ thống ở mức độ thấp cần phải đủ lớn cho thông báo hợp lệ lớn nhất, do đó,
  • để có hiệu quả, bộ đệm phải được người gọi cấp phát trước.

Vì vậy, không có ý nghĩa khi có bộ đệm có kích thước động. Như Cubbi chỉ ra, UDP datagrams có một kích thước tối thiểu nhỏ anyway, vì vậy chỉ cần làm cho bộ đệm của bạn lớn như thông điệp hợp lệ lớn nhất trong hệ thống của bạn và được thực hiện với nó.

+3

'boost :: asio :: buffer' là một bộ đệm đầu vào/đầu ra ASyncronous chung, và không chỉ được sử dụng cho UDP. – orlp

+0

Chắc chắn. Và nói chung nó không có ý nghĩa để có một năng động. Không phải cho ứng dụng của bạn cũng như TCP cũng như bất kỳ giao thức nào khác mà cuối cùng gọi các thường trình C cấp thấp để thực hiện công việc của họ, vì nó sẽ chỉ dẫn đến việc sao chép bộ nhớ không hiệu quả, trong đó có sự anathema trong C++ và Boost. –

1

Nếu bạn sử dụng bộ đệm nhỏ hơn, bạn có thể dễ dàng kết nối chúng lại với nhau thông qua các khái niệm * BufferSequences. Ví dụ: bạn có thể chuyển vào một số MutableBufferSequence để chấp nhận dữ liệu từ cuộc gọi đã đọc (2) hoặc vượt qua ConstBufferSequence để biết danh sách các vùng đệm bạn sẽ viết (2). Điều đó nói rằng, tôi có xu hướng khuyên bạn nên sử dụng một bộ đệm duy nhất trong mỗi hướng bởi vì nó có xu hướng đơn giản hóa mã (mặc dù đó không phải lúc nào cũng có thể).

Các vấn đề liên quan