LINUX.ORG.RU

Winsock и HTTP POST-запрос


0

0

Добрый вечер. Тут разбираюсь с winsock. Нашёл пример и пытаюсь переделать его; чтобы на скрипт up.php(<?php copy($zak, «user/$zak_name»)?>) отправлялся файл. С помощью браузера файл отправляется на отлично. С помощью программы нет. Я уже с помощью снифера(wireshark) просто скопировал все запросы в программу, но даже так не хочет отправлятся. Вот ссылка на скрин где слева обычный запрос, справа через программу: http://i7.fastpic.ru/big/2010/0627/09/a32226fb7d62f975f5ca68a638210c09.jpg . Вот код программы:

#include "stdafx.h"
#define _DEBUG_PRINT(X)   
#include <windows.h>
#include <winsock.h>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
 
 
#pragma comment(lib,"Wsock32.lib")
 
 
#define SEND_RQ(MSG) \
                /*cout<<send_str;*/ \
  send(sock,MSG,strlen(MSG),0);
 
int request (char* hostname, char* parameters, string& message);
 
 
 
 
int main()
{
        string message;
        int a = request ("мойхост.freehostia.com", "", message);
        return 0;
 
}
 
int request (char* hostname, char* parameters, string& message)
{
    string test;
    WSADATA WsaData;
    WSAStartup (0x0101, &WsaData);
    sockaddr_in       sin;
    int sock = socket (AF_INET, SOCK_STREAM, 0);
    if (sock == -1) 
        {
                return -100;
        }
    sin.sin_family = AF_INET;
    sin.sin_port = htons( (unsigned short)80);
 
    struct hostent * host_addr = gethostbyname(hostname);
   
    sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list) ;

    connect (sock,(const struct sockaddr *)&sin, sizeof(sockaddr_in) );    
 
        string send_str;
		char *sendbuf ="987"; 

		
        SEND_RQ("POST /up.php HTTP/1.1\r\n");
        SEND_RQ("User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.5.24 Version/10.53\r\n");
        SEND_RQ("Host: мойхост.freehostia.com\r\n");
		SEND_RQ("Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n");
        SEND_RQ("Accept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\n");
		SEND_RQ("Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n");
		SEND_RQ("Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n");
		SEND_RQ("Referer: http://мойхост.freehostia.com/Simpleupload.html\r\n");
        SEND_RQ("Cookie: __utma=2....  \r\n");
		SEND_RQ("Cookie2: $Version=1\r\n");
		SEND_RQ("Connection: Keep-Alive, TE\r\n");
		SEND_RQ("TE: deflate, gzip, chunked, identity, trailers\r\n");
        SEND_RQ("Content-Length: 172\r\n");
        SEND_RQ("Content-Type: multipart/form-data; boundary=------------iyYiiH1goXBKlKW1LwhpRm\r\n");
		SEND_RQ("\r\n");
		//Вот сдесь начинается проблема(wireshark считает, что дальше запрос неверно составлен)и на сайт файл не отправляется
        SEND_RQ("------------iyYiiH1goXBKlKW1LwhpRm\r\n");
        SEND_RQ("Content-Disposition: form-data; name=\"zak\"; filename=\"test.txt\"\r\n");
        SEND_RQ("Content-Type: text/plain\r\n\r\n");
		send(sock,sendbuf,(int)strlen(sendbuf),0);
        SEND_RQ("\r\n");
        SEND_RQ("------------iyYiiH1goXBKlKW1LwhpRm--\r\n");
		

		
        //_DEBUG_PRINT(cout<<"####HEADER####"<<endl);
        char c1[1];
        int l,line_length;
        bool loop = true;
        bool bHeader = false;
 
        while(loop) 
        {
                l = recv(sock, c1, 1, 0);
                if(l<0) loop = false;
                if(c1[0]=='\n') 
                {
                        if(line_length == 0) loop = false;
                        line_length = 0;
                        if(message.find("200") != string::npos)
                        bHeader = true;
                }
                else if(c1[0]!='\r') 
                         line_length++;
                _DEBUG_PRINT( cout<<c1[0]);
                message += c1[0];
        }
 
        message="";
        if(bHeader) 
        {
           _DEBUG_PRINT( cout<<"####BODY####"<<endl) ;
           char p[1024*10];
           l = recv(sock,p,1024*10-1,0)
           _DEBUG_PRINT( cout.write(p,l)) ;
           p[l] = '\0';
           message += p;
           _DEBUG_PRINT( cout << message.c_str());
        }
        else 
        {
                return -102;
        }
        
        closesocket(sock);
        WSACleanup( );
 
        return 0;
}

Подскажите пожалуйста где ошибка. Уже два дня мучаюсь не могу увидеть где она.

Может быть здесь?

        SEND_RQ("Content-Type: multipart/form-data; boundary=------------iyYiiH1goXBKlKW1LwhpRm\r\n"); 
>>>      SEND_RQ("\r\n");  <<<
      //Вот сдесь начинается проблема(wireshark считает, что дальше запрос неверно составлен)и на сайт файл не отправляется 

edigaryev ★★★★★ ()
Ответ на: комментарий от xorik

Сокеты в виндоус и в линуксе не имеют столь явных отличий. В любом случае они остаются сокетами и там и там. Притом впервые они были реализованы на Unix-системе.

Deliza ()

Медитация над исходными кодами занятие неблагодарное.

Причины этой проблемы не знаю, но есть замечания.

1. Если функция может вернуть код ошибки, то надо проверять возвращаемое значение, ВСЕГДА. Без этого ты будешь страдать от всякой фигни.

2. Почитай про send(), там вроде ясно сказано

If no error occurs, send returns the total number of bytes sent, which can be LESS than the number indicated by len

То есть надо дослать то, что не дослали.

pathfinder ★★★★ ()
Ответ на: комментарий от edigaryev

Нет. Без этого даже не выходит POST-запроса.В этом случае получаю от сервера ответ «HTTP/1.1 400 Bad Request (text/html)».

Deliza ()
Ответ на: комментарий от Deliza

Погуглил чуток. Вот что увидел в примерах:

объявление

Content-Type: multipart/mixed; 
          boundary=gc0p4Jq0M2Yt08jU534c0p

начало одного сообщения

--gc0p4Jq0M2Yt08jU534c0p

конец последнего сообщения

--gc0p4Jq0M2Yt08jU534c0p--

Похоже граница обрамляется "--" одной или с двух сторон в зависимости от ситуации. У тебя вроде этого нет.

pathfinder ★★★★ ()
Ответ на: комментарий от pathfinder

Обрамляется с двух сторон в конце всего запроса. В другом случае обрамляется спереди. в конце моего запроса обрамляется с двух сторон SEND_RQ("------------iyYiiH1goXBKlKW1LwhpRm--\r\n");

Deliza ()
Ответ на: комментарий от Deliza

у меня такие запросы работают вырезал все остальные поля из запроса оставил саму суть

Content-Type: multipart/form-data; boundary=1a82\r\n
Content-Length: 75\r\n\r\n
--1a82\r\n
Content-Disposition: form-data; name="value"\r\n\r\n
2272400\r\n
--1a82--\r\n

osox ()
Ответ на: комментарий от osox

о! спасибо, заработало. всегда надо начинать с малого!

Deliza ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.