mình muốn lập trình để gửi 1 file bằng giao thức FPT hoặc http, lập trình bằng VC++ , bạn nào từng làm qua có thể giúp mình, nếu có code minh họa càng tốt
--thanks--
Ok, để upload file qua http thì dĩ nhiên bạn phải biết cấu trúc gói tin theo định dạng http rồi từ đó xây dựng gói tin theo đúng định dạng đó. Khi đó gói tin được gửi đi sẽ giống hệt với những gì mà trình duyệt gửi đi khi bạn upload file bằng trình duyệt. Một gói tin theo phương thức POST thì đại loại như sau:
Post Code:
1. POST /path HTTP/1.0 2. Host: hostname 3. User-Agent: whatever you want.... /*Firefox sẽ là:User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; v:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1*/ 4. Accept: image/png,*/*;q=0.5 5. Accept-Language: en-us,en;q=0.5 6. Accept-Encoding: gzip,deflate 7. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8. Keep-Alive: 300 9. Referer: whatever you want 10. Cookie: __utma=233980825.275442633.1176451854.1176473654.1176509897.3; __utmz=233980825.1176451854.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); JSESSIONID=0723EE3CC52250179503578502607239.tomcat5c 11. Authorization: I don't know 12. Content-Type: application/x-www-form-urlencoded 13. Content-Length: sizeof data 14. data
Và đây là tất cả những gì cần gửi khi mình login vào Yahoo:
(******) là username và pass của mình nên dĩ nhiên ở đây phải đổi đi rồiPost Code:
POST /config/login? HTTP/1.1 Host: login.yahoo.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: https://login.yahoo.com/config/login_verify2?&.src=ym Cookie: F=a=HZAuJdssvfxgvgsyX9RqmOINWzhObYtitmp8fw7ctud5r3eOH9s70YvM7S1d&b=maFL; U=mt=eTbbTZ2MhYr570pgzNc.REeF7vSl2lRCvR5Kew--&ux=NE0OGB&un=64fkaasqvgs69; B=aet8s15314fuq&b=3&s=lc; op122geohomeliid=a0060330k6234nh0122oqfa9e; op122geohomegum=a0060330k6234nh0122oqfa9e; YLS=v=1&p=0&n=0; Y=v=1&n=c57bq20mh8n76&p=; YGCV=d=; PH=fn=numo7umpIZrpHAV.; HP=1; sS=l=m08j7eij/o Content-Type: application/x-www-form-urlencoded Content-Length: 297 .tries=1&.src=ym&.md5=&.hash=&.js=&.last=&promo=&.intl=us&.bypass=&.partner=&.u=er0i09p33qmsr&.v=0&.challenge=Kx5bO1w.x76QKJ2MglGzle7xA7nh&.yplus=&.emailCode=&pkg=&stepid=&.ev=&hasMsgr=0&.chkP=Y&.done=http%3A%2F%2Fmail.yahoo.com&.pd=ym_ver%253d0%2526c%3D&login=******&passwd=******&.save=Sign+In
Tuy nhiên vì bạn POST lên host của mình (chắc vậy) nên để đơn giản có thể chỉ cần để lại các dòng: 1, 2, 12, 13, 14 là được.
Ở đây của bạn là upload file nên việc xây dựng data (14) là khá phức tạp. Bạn có thể tham khảo code này
http://www.alhem.net/Sockets/html/cl...ostSocket.html
Bạn download thư viện đó về rồi dịch ra (file .lib) và sau đây là cách sử dụng nó:
Visual C++ Code:
#include "stdafx.h" #include "../socket/HttpPostSocket.h" #include "../socket/SocketHandler.h" ... using namespace std; ULONG Upload() { string buffer; SocketHandler h; HttpPostSocket s(h, "http://hostname/upload.php"); unsigned char* p = new unsigned char[32000]; memset(p, 0, 32000); s.SetDataPtr(p, 31999); s.AddFile("image", "filename", "text/plain"); s.Open(); h.Add(&s); while (h.GetCount()) { h.Select(1, 0); } bool complete = s.Complete(); if (complete) { buffer = static_cast<std::string>((char*)s.GetDataPtr()); } return 1; }
đoạn code trên tương ứng với đoạn code html tạo ra một cái form rồi ấn submit
HTML Code:
Ngoài ra có một thư viện khá nổi tiếng là cURL và liburl (cái này mình cũng đang nghiên cứu) có thể dùng cho rất nhiều giao thức khác nhau:
Tạm thời thế đãcurl is a command line tool for transferring files with URL syntax, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE and LDAP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks.
Đã được chỉnh sửa lần cuối bởi vinhie47 : 06-05-2007 lúc 11:50 AM.