ايران ويج

نسخه‌ی کامل: راهنمايي براي نوشتن برنامه تحت پروتكل HTTP
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با ياد خدا
سلام دوستان
من با برنامه نويسي شبكه اشنا هستم و برنامه هاي ساده رو هم نوشتم
الان ميخوام با استفاده از متد put پروتكل HTTP فايلي رو روي سايتي اپلود كنم متاسفانه بعد از جستجو به نتيجه مطلوبي نرسيدم و تنها چيزي كه دستگير شد اينه كه از include http.h بايد استفاده كنم. همين
دوستان يك كد ساده كه بتونم با اون استفاده از متد هاي اين پروتكل رو ياد بگيرم يا يك مقاله يا لينك انگليسي يا فارسي مهم نيست فقط ساده و به اصطلاح step by step باشه ممنون ميشم راهنمايي كنيد.
كسي نيست در اين زمينه راهنمايي كنه؟
کسی هست ولی گوگل فیلتره :d
(اون هدر http.h جز هدرهای استاندارد هست یا یکی واسه خودش نوشته؟)
کد:
#include <iostream>
#include <winsock2.h>
#include <string>
using namespace std;

//link libwsock32.a

unsigned long WinsockStart()
{
     WSADATA wsa;
     unsigned long ulong;
     struct hostent *host;

     if(WSAStartup(MAKEWORD(2,2), &wsa) < 0)
     {
          cout << "Error WinsockStart()" << endl;
          WSACleanup();
          return 1;
          }

     if((host=gethostbyname("www.example.com"))<0)
     {
          cout << "Fehler gethostbyname()" << endl;
          WSACleanup();
          return 2;
          }

     ulong = *(unsigned long*) host->h_addr;

     return ulong;
      }

     void error_exit(string text)
     {
     cout << text;
     WSACleanup();
     exit(EXIT_FAILURE);
      }



int main()
{
SOCKET sock;
struct sockaddr_in addr;
unsigned long win=0;
int con = 0, gr=0, send_r=0, rec=0;
char header[2048], puffer[2018];
string to_send="hello world";
string name="test99.txt";

win=WinsockStart();
   if(win==1||win==2)
      error_exit("Error WinsockStart()");

addr.sin_family=AF_INET;
addr.sin_port=htons(80);
addr.sin_addr.s_addr = win;

sock = socket(AF_INET, SOCK_STREAM, 0);
   if(sock<0)
      error_exit("Error socket()");

gr = (to_send.size()+name.size()+287);

sprintf(header, "POST /upload.php HTTP/1.1\r\n");
sprintf(header, "%sHost: www.example.com\r\n", header);
sprintf(header, "%sConnection: Keep-Alive\r\n", header);
sprintf(header, "%sContent-Type: multipart/form-data; boundary=---------------------------90721038027008\r\n", header);
sprintf(header, "%sContent-Length: %d\r\n", header, gr);
sprintf(header, "%s\r\n", header);
sprintf(header, "%s-----------------------------90721038027008\r\n", header);
sprintf(header, "%sContent-Disposition: form-data; name=\"upfile\"; filename=\"%s\"\r\n", header, name.c_str());
sprintf(header, "%sContent-Type: text/plain\r\n", header);
sprintf(header, "%s\r\n", header);
sprintf(header, "%s%s\r\n", header, to_send.c_str());
sprintf(header, "%s-----------------------------90721038027008\r\n", header);
sprintf(header, "%sContent-Disposition: form-data; name=\"post\"\r\n", header);
sprintf(header, "%s\r\n", header);
sprintf(header, "%supload\r\n\r\n", header);
sprintf(header, "%s-----------------------------90721038027008--\r\n\r\n\0", header);      

con = connect(sock, (SOCKADDR*)&addr, sizeof(addr));
   if(con < 0)
      error_exit("Error connect()");

if(send_r=send(sock, header, strlen(header), 0)<0)
      error_exit("Error send()");

while(rec=recv(sock, puffer, 2048, 0))
{
  if(rec==0)
    error_exit("Server quit");

printf("%s", puffer);
}              

closesocket(sock);
WSACleanup();
return EXIT_SUCCESS;
}
این کد با استفاده از توابع api این کارو انجام میده
شما اول می تونی کانکت شی دیتا بفرستی؟
اگه این تیکه رو انجام دادی بقیه فقط متن که ارسال می شه (البته get , post رو کار کردم)
اینا رو ببین
http://www.w3.org/Protocols/rfc2616/rfc2616.html
http://www.w3.org/Protocols
ممنون از راهنمااييتون ببينيد من اول فكر كردم http.h استاندارد هست اما ظاهرا اين طور نيست من به كتابخانه هاي ديگه هم برخورد كردم مثل HTTP.h -------- curl-------httpext.h و....

چيزي كه براي من سوال هست اينه كه آيا ميشه با همون توابع اصلي شبكه مثل Socket() , Connect , bild(),..... كارمون رو راه بندازيم ؟ يعني اين توابع ميشه و كتابخانه هايي كه در بالا اشاره كردم براي راحتي كار هست. ايا اينجوريه

يا توابع بالا مكمل توابع اصلي شبكه هست؟ من اين براي سواله كه اخرش توابع شبكه كه قرار بود سرتا پاي TCP/IP رو پوشش بده كو؟؟؟؟


نخير من اتصال هم برقرار نكردم چون نميدونم از كدوم تابع استفاده كنم براي اين كار قبلا پورت اسكنر هاي ساده و ... نوشتم تو شبكه اما براي گنگ هست استفاده از پروتكل هاي ديگه TCP مانند همين متد put پروتكل http
لطفا اگه كسي ميتونه كمك كنه دريغ نكنه چون خيلي قاطي كردم