2010-11-04 19 views
5

Khi tôi nói thư viện không chuẩn, tôi đề cập đến những thứ như Boost, libCurl và bất kỳ thứ gì khác có thể thực hiện việc này dễ dàng hơn tiêu chuẩn C++ có thể. Lý do cho điều này là tôi đang viết một ứng dụng như là một phần của môn học (lớp được dành riêng cho C++) và tôi bắt buộc chỉ sử dụng các thư viện và hàm chuẩn.Tải xuống tệp từ web trong C++ mà không sử dụng thư viện không chuẩn trên Linux

Tôi đang tìm cách tải xuống tệp RSS, sử dụng URL mà người dùng sẽ cung cấp (Tôi đang xây dựng một ứng dụng RSS thô sơ) và vấn đề lớn nhất mà tôi đang gặp phải là tôi không chắc chắn cách tệp xuống. Một khi tôi vượt qua nó, phân tích nó cho các thẻ xml và hiển thị nội dung sẽ tương đối đơn giản. Tôi đã nhìn xung quanh và tôi đã chỉ tìm thấy các giải pháp cho rằng sử dụng các thư viện không chuẩn, thường là libCurl. Nếu ai đó có thể chỉ cho tôi một cái nhìn nhanh về những gì tôi nên xem xét cho điều này, sau đó tôi sẽ biết ơn.

Ngoài ra, nếu bạn nghĩ rằng bạn đang giúp tôi ăn gian, bạn thì không. Nhiệm vụ là xây dựng một ứng dụng của sự lựa chọn của chúng tôi và chúng tôi đang được phân loại vào việc sử dụng các tính năng khác nhau của ngôn ngữ (nó phải chứa rất nhiều lớp, sử dụng các loại biến này, v.v.).

+0

Câu hỏi thực tế là gì? Bạn có muốn ai đó viết cho bạn một ứng dụng để làm điều này không? Bạn đã viết của riêng bạn và đang gặp vấn đề với nó? –

+0

@jon hanson Tôi chỉ đang tìm một người để chỉ cho tôi đúng hướng, và tôi đã cập nhật câu hỏi để phản ánh điều này. –

+2

"Khi tôi vượt qua được chút đó, phân tích cú pháp cho các thẻ xml và hiển thị nội dung sẽ tương đối đơn giản." - chúc may mắn với điều đó. – JeremyP

Trả lời

8

Check-out Beej's Guide to Network Programming cho một giới thiệu vắn tắt nhưng tuyệt vời để ổ cắm. Nếu bạn không thể sử dụng bất kỳ thư viện không chuẩn nào, tùy chọn duy nhất của bạn là kết nối thủ công trên cổng 80 và tự thực hiện yêu cầu.

Giả sử ngay cả kiến ​​thức cấp độ mới bắt đầu về C++, đó là tất cả những gì bạn cần.

2

Nếu bạn thực sự muốn làm điều đó mà không sử dụng libcurl bạn luôn có thể mở một socket TCP nào và sau đó gửi:

GET /myurl 

(http 1.0 hoặc tốt hơn là sử dụng http 1.1)

Về cơ bản bạn đang viết một thực hiện giao thức http khách hàng rất đơn giản.

+0

libcurl chắc chắn thuộc danh mục "thư viện chuẩn". –

+0

@hassan Tôi đồng ý, nhưng câu hỏi được yêu cầu cụ thể về "không sử dụng libcurl" khiến cho ít sự lựa chọn – Flexo

+0

thực sự, chỉ thấy điều đó. Kỳ lạ là bất kỳ giảng viên đại học nào cũng sẽ dẫn dắt lớp của mình giả định rằng libcurl được coi là không chuẩn. Nhưng dù sao câu trả lời tốt nhất tiếp theo cho OP là "đọc" mã nguồn curl. –

0

Bạn có thể tải về mã nguồn cho wget tiện ích tiêu chuẩn

0

Vì bạn không được phép sử dụng thư viện không chuẩn, bạn có thể viết lớp trình bao bọc nguyên thủy của riêng bạn cho lệnh "curl" linux (tôi giả sử bạn đang sử dụng Linux). Curl là một lệnh rất mạnh, và nó có thể làm những gì bạn cần.

9

Trước hết, bạn không thể thực hiện bằng chỉ sử dụng C++ chuẩn. Không có giao diện mạng ở chuẩn C++ hoặc tiêu chuẩn C.

Nếu bạn được yêu cầu thực hiện phương pháp "tự thực hiện", thì có thể bạn sẽ sử dụng API ổ cắm nền tảng của mình. Trong trường hợp của Linux, đây là một phần của tiêu chuẩn POSIX, không phải là C++ và có sẵn từ <sys/socket.h>.

Quy trình cơ bản là: phân tích cú pháp URL; tra cứu địa chỉ IP của miền; tạo một ổ cắm; kết nối ổ cắm; viết một yêu cầu HTTP vào socket; đọc phản hồi HTTP từ socket; dọn dẹp. Rõ ràng, một thư viện HTTP thuận tiện hơn rất nhiều, đặc biệt là khi tải xuống HTTP có thể phức tạp hơn những gì tôi mô tả ở trên (ví dụ: nếu máy chủ phản hồi bằng chuyển hướng). Khá nhiều bản phân phối Linux sẽ cung cấp libcurl và/hoặc các chương trình curlwget.

+0

+1 để chỉ ra rằng không phải là C++ – Flexo

+1

+1 để chỉ ra rằng không có giao diện mạng trong thư viện chuẩn C++ (hoặc C). –

3

Viết chương trình để tạo kết nối ổ cắm tương đối nhỏ.

http://www.linuxhowtos.org/C_C++/socket.htm

Bây giờ bạn có một ổ cắm mở cửa cho một máy chủ HTTP bạn cần phải hiểu làm thế nào để yêu cầu một tài liệu và làm thế nào để giải mã câu trả lời:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

Về cơ bản bạn cần gửi:

GET<SP><URL><SP>HTTP/1.1<CRLF> 

Where: 
    SP: Single Space 
    CRLF: \r\n 
    URL: The Full URL of the page including the server name. 

Những gì bạn nhận lại sẽ là

http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6

HTTP/1.1<SP>200<SP>OK<CRLF> 
(<Header><CRLF>)* 
<CRLF> 
<Document> 

Các phương tiện trên:

  • Dòng đầu tiên là dòng hồi đáp phải chứa 200 OK.
    • Nếu không có lỗi nào đó và bạn chỉ nên bỏ cuộc.
  • Tiếp theo là 0 hoặc nhiều dòng tiêu đề
    • Chỉ cần bỏ qua những dòng
  • Sẽ có 1 dòng trống để đánh dấu sự kết thúc của phần đầu.
  • Sau đó, tài liệu sẽ có trên luồng.
+0

"Nếu nó không thì có một số loại lỗi và bạn chỉ cần bỏ cuộc." - tốt, có 3xx. Với URL do người dùng cung cấp, rất có thể nó sẽ trở thành cần thiết để theo dõi chuyển hướng. –

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