2010-02-05 37 views
10

Trong C++, nếu tôi có một ổ cắm, làm thế nào tôi có thể tạo một đối tượng ostream từ nó?Làm cách nào để tạo 'ostream' từ ổ cắm?

Tôi có googled một số ví dụ: http://members.aon.at/hstraub/linux/socket++/docu/socket++_10.html

Và tôi đã cố gắng:

sockbuf sb(sockfd); 
std::ostream outputStream(&sb); 

Nhưng tôi không thể tìm thấy file .h và thư viện liên kết với cho 'sockbuf'. Đó có phải là một phần của thư viện chuẩn C++ không?

Trả lời

17

Trang web bạn tìm thấy là thư viện không phải của bên thứ ba. Không có thư viện socket C++ chuẩn nào.

Tuy nhiên, nếu bạn muốn gần nhất với giải pháp chuẩn (và mạnh mẽ!), Bạn nên thử Boost.Asio. Nó đã được đề xuất đưa vào thư viện chuẩn (TR2). Dưới đây là ví dụ dựa trên iostream:

boost::asio::ip::tcp::iostream stream("www.example.org", "http"); 
stream << "GET/HTTP/1.0\r\nHost: www.boost.org\r\n\r\n" << std::flush; 

std::string response; 
std::getline(stream, response); 

Tuy nhiên, bạn sẽ thu được nhiều hơn nếu sử dụng Proactor của Asio cho hoạt động không đồng bộ.

+1

+1 để tham chiếu Asio. :-) –

+1

@Chris, tôi đã học cách yêu và đánh giá nó sau khi viết 1 năm về mặt thương mại máy chủ C++, và sau đó nhìn thấy nó dễ dàng như thế nào với Asio :) –

4

Chuẩn C++ (ít nhất C++ 98) không xử lý kết nối mạng theo bất kỳ cách nào. Vì vậy, bạn phải làm một cái gì đó nền tảng cụ thể.

Một số nền tảng có triển khai IOStream cho phép bạn tạo luồng từ trình mô tả tệp. Trong trường hợp đó, hãy sử dụng bộ mô tả socket làm bộ mô tả tệp của bạn.

+2

+1: Tôi chưa bao giờ nghĩ đến việc thực sự truyền một 'fd 'đến một iostream Oo –

+0

Tôi đang viết ứng dụng của mình trên ubuntu. Liệu nó có IOStreams cho phép tôi tạo ra một dòng từ một ổ cắm? Làm thế nào tôi có thể tìm kiếm điều đó? – silverburgh

+0

@silverburgh: GCC 3.4 trở đi, vì vậy tôi nghe, có '__gnu_cxx :: stdio_filebuf', mà bạn có thể sử dụng cho điều đó. Bài viết này đáng chú ý đến: http://www.synflood.at/blog/index.php?/archives/456-One-word-of-warning-about-stdio_filebuf.html –

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