Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы при написании клиента HTTP, Посылка бинарного файла методом POST 
:(
    Опции темы
erslgoeirjh
Дата 16.12.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Здравствуйте, уважаемые участники форума!

Я пишу на Visual C++ клиент HTTP, который посылает на сервер бинарный файл методом POST.
Имеется такой код:

Код

BOOL  MySendFile(TCHAR* myfilename)
// посылка выбранного файла на сервер
{

    int  sock, recv_len, af, sendres, res;
    unsigned long  mysize, szCodedData, lSize;
    TCHAR answercode[4], recv_buf[1024], *CodedData, mystrsize[10], myhostname[80];
    struct sockaddr_in  servAddr;
    struct hostent *hp;
    FILE *f;
    WSADATA  W;
    
    f = fopen(myfilename,"rb");
    fseek(f,0,SEEK_END);
    lSize = ftell(f);
    fclose(f);
    szCodedData = (unsigned long)(1.5*(long double)lSize);
    CodedData = new TCHAR[szCodedData];
    if (!(mysize=base64encode(myfilename,CodedData,szCodedData)))
    // myfilename -- имя выбранного файла
    // CodedData -- буфер, в который кодируется по методу base64 этот файл
    // szCodedData -- размер этого буфера
    {
        MessageBox(NULL,"Невозможно преобразовать файл по методу base64.","Ошибка",MB_OK);
        delete []CodedData;
        return  FALSE;
    }
    res = WSAStartup(0x0101,&W);
    sock = socket(AF_INET,SOCK_STREAM,0);    
    if (sock<0)
    {
        MessageBox(NULL,"Невозможно создать сокет.","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    memset((TCHAR*)&servAddr,0,sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    hp = gethostbyname("localhost");
    memcpy(&servAddr.sin_addr,hp->h_addr,hp->h_length);
    servAddr.sin_port = htons(PORTNUMBER);
    if (res = connect(sock,(sockaddr*)&servAddr,sizeof(servAddr))<0)
    {
        MessageBox(NULL,"Невозможно установить сокетное соединения.","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"POST /upload.php HTTP/1.1\r\n");                // ïðàâèëüíî ëè?
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Host: ");                          
    strcat(mymessage,"localhost");
    strcat(mymessage,"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Type: multipart/form-data;\r\n\tboundary=----------164756348538\r\n");  
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    /* strcpy(mymessage,"Content-Length: "); // óòî÷íèòü íàñ÷¸ò Content-Length
    ultoa(mysize,mystrsize,10);
    strcat(mymessage,mystrsize);
    strcat(mymessage,"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    } */
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Connection: close\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Cache-control: no-cache\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n\r\n\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"------------164756348538\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Disposition: form-data; name=\"send_file\"; filename=\"");
    strcat(mymessage,myfilename);
    strcat(mymessage,"\"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {   res = WSAGetLastError();
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Type: application/octet-stream\r\n");  
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {   res = WSAGetLastError();
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Length: "); 
    ultoa(mysize,mystrsize,10);
    strcat(mymessage,mystrsize);
    strcat(mymessage,"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Transfer-Encoding: base64\r\n\r\n"); 
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    sendres = send(sock,CodedData,mysize,0);    // îòïðàâëÿåì ôàéë íà ñåðâåð
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"------------164756348538--\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    recv_len = recv(sock,recv_buf,strlen(recv_buf),0); // ñ÷èòûâàåì îòâåò ñ ñåðâåðà
    if (recv_len<=0)
    // если длина ответа меньше или рана нулю
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Ошибка приёма ответа с сервера","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    recv_buf[recv_len] = '\0';
    MessageBox(NULL,(LPCTSTR)recv_buf,"Ответ сервера",MB_OK);
    /* strncpy(answercode,recv_buf,3);   // ñ÷èòûâàåì çíà÷åíèå êîäà îòâåòà ñåðâåðà
    answercode[3] = '\0';
    if ((strcmp(answercode,"200")!=0)&&(strcmp(answercode,"201")!=0))
    // åñëè êîä îòâåòà ñåðâåðà íå ðàâåí 200 èëè 201
    {
        MessageBox(NULL,"Íåóäà÷íàÿ ïåðåäà÷à ôàéëà.","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }  */
    closesocket(sock);
    WSACleanup();
    delete []CodedData;
    return  TRUE;
} // конец функции MySendFile




Суть этой функции такова -- методом POST посылает на сервер бинарный файл (заданный параметром myfilename), предварительно закодировав его методом base64.

При этом в блоке
Код

strcpy(mymessage,"Content-Type: application/octet-stream\r\n");  
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {   res = WSAGetLastError();
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }


возникает ошибка при передаче сообщения функцией send (но до этого вызовы send работают нормально). Код этой ошибки -- 10053. Одна из причин этой ошибки может быть в том, что я не правильно написал заголовок или тело метода POST. (Я некоторые части кода закомментировал для отлладки).

В чём может быть причина этого?

На моём компьютере стоит сервер UniServer, ниже приведён HTML-код страницы http://localhost/ :

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=cp1251" />
<title>Apache test.</title>
</head>
<body>
<form enctype="multipart/form-data" action="upload.php" method="post">
 <input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
 Отправить этот файл: <input name="userfile" type="file" />
 <input type="submit" value="Send File" />
</form>

</body>
</html>




Если посылать файл с помощью этой страницы, то посылка происходит успешно, а в результате неё в файле access.log этого сервера добавляется следующая строка:

127.0.0.1 - - [14/Dec/2005:13:30:44 +0300] "POST /upload.php HTTP/1.1" 200 322 "http://localhost/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)"

Если же я посылаю из своей программы, то у меня получается другая строка:

127.0.0.1 - - [14/Dec/2005:17:55:33 +0300] "POST /upload.php HTTP/1.1" 200 148 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"

Почему у меня во второй строке не пишется после двух чисел "http://localhost/" ?

Что мне нужно исправить в моей функции, чтобы она нормально работала?


Это сообщение отредактировал(а) erslgoeirjh - 16.12.2005, 12:07
PM MAIL   Вверх
Aleksandor
Дата 16.12.2005, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: нет
Всего: 12



Тут что-то напутано с заголовками...
Например строчка
Код

strcpy(mymessage,"Content-Type: multipart/form-data;\r\n\tboundary=----------164756348538\r\n");  


должна выглядеть как
Код

strcpy(mymessage,"Content-Type: multipart/form-data;\n\tboundary=----------164756348538\r\n");  

(без \r в середине строки, только \n) smile

Еще непонятно зачем так много переводов строки в
Код

strcpy(mymessage,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n\r\n\r\n");


В конце блока данных думается надо добавить 2 перевода строки, иначе граница прилепится к данным-
вместо
strcpy(mymessage,"------------164756348538--\r\n"); пишем
strcpy(mymessage,"\r\n\r\n------------164756348538--\r\n");


IMHO протокол HTTP лучше взять для начала 1.0 - он проще. И надо проверить чтобы все соответствовало RFC smile
Думаю нужно определиться с заголовками, расставить все по полочкам в соответствии с rfc, а отослать все буферы можно за один вызов WSASend.

Это сообщение отредактировал(а) Aleksandor - 16.12.2005, 15:36


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Guest
Дата 16.12.2005, 15:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Aleksandor @ 16.12.2005, 15:04)
И надо проверить чтобы все соответствовало RFC smile
Думаю нужно определиться с заголовками, расставить все по полочкам в соответствии с rfc, а отослать все буферы можно за один вызов WSASend.

Aleksandor, а в каких RFC можно прочитать про формат команды POST?
  Вверх
erslgoeirjh
Дата 16.12.2005, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Цитата(Aleksandor @ 16.12.2005, 15:04)
IMHO протокол HTTP лучше взять для начала 1.0 - он проще. И надо проверить чтобы все соответствовало RFC smile
Думаю нужно определиться с заголовками, расставить все по полочкам в соответствии с rfc, а отослать все буферы можно за один вызов WSASend.

Aleksandor, а в каких RFC можно прочитать про формат команды POST?
PM MAIL   Вверх
Aleksandor
Дата 16.12.2005, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: нет
Всего: 12



Цитата(Guest @ 16.12.2005, 15:15)
Цитата
Aleksandor, а в каких RFC можно прочитать про формат команды POST?


Ну например вот здесь
http://www.codenet.ru/webmast/http/rfc2068/
есть неплохое описание. Еще можно посмотреть frc 1867


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
erslgoeirjh
Дата 16.12.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Aleksandor, я нашёл следующее:

http://www.phpclub.ru/detail/article/http_request#part_3_2

Насколько там верно приведены образцы POST-запроса?
PM MAIL   Вверх
Aleksandor
Дата 16.12.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: нет
Всего: 12



Да вроде все правильно smile Толко Connection close я бы добавил.
Честно говоря я с POST не работал , только с GET, но писал почтовый клиент типа theBat! - в принципе этот метод (POST) очень похож на работу с MIME.

Главное не забывай что если команда многострочная, то делай только soft-breake (\n), иначе это будет уже как две разные команды, причем вторая неизвестная smile

Попробуй разные варианты, возможно сервер не понял что-то и разорвал соединение... Лучше конечно печатать в файл все коммуникации-пригодится для отладки.


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
erslgoeirjh
Дата 16.12.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Aleksandor, спасибо за советы. Теперь у меня клиент работает!

Вот его код:

Код

BOOL  MySendFile(char* myfilename)
// ïîñûëêà âûáðàííîãî ôàéëà íà ñåðâåð ÷åðåç ñîêåòíóþ ñâÿçü
{

    int  sock, recv_len, af, sendres, res;
    unsigned long  mysize, mysize1, szCodedData, lSize, lres;
    TCHAR answercode[4], recv_buf[1024], *CodedData, mystrsize[12], myhostname[80];
    struct sockaddr_in  servAddr;
    struct hostent *hp;
    FILE *f;
    WSADATA  W;
    
    f = fopen(myfilename,"rb");
    fseek(f,0,SEEK_END);
    lSize = ftell(f);
    fclose(f);
    szCodedData = (unsigned long)(1.5*(long double)lSize);
    CodedData = new TCHAR[szCodedData];
    if (!(mysize=base64encode(myfilename,CodedData,szCodedData)))
    // myfilename -- èìÿ âûáðàííîãî ôàéëà
    // CodedData -- áóôåð, â êîòîðûé êîäèðóåòñÿ ïî ìåòîäó base64 ýòîò ôàéë
    // szCodedData -- ðàçìåð ýòîãî áóôåðà
    {
        MessageBox(NULL,"Íåâîçìîæíî ïðåîáðàçîâàòü ôàéë ïî ìåòîäó base64.","Îøèáêà",MB_OK);
        delete []CodedData;
        return  FALSE;
    } 
    res = WSAStartup(0x0101,&W);
    sock = socket(AF_INET,SOCK_STREAM,0);
    res = WSAGetLastError();
    if (sock<0)
    {
        MessageBox(NULL,"Íåâîçìîæíî ñîçäàòü ñîêåò.","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    memset((TCHAR*)&servAddr,0,sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    hp = gethostbyname("localhost");
    memcpy(&servAddr.sin_addr,hp->h_addr,hp->h_length);
    servAddr.sin_port = htons(PORTNUMBER);
    if (res = connect(sock,(sockaddr*)&servAddr,sizeof(servAddr))<0)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Íåâîçìîæíî óñòàíîâèòü ñîêåòíîå ñîåäèíåíèå.","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"POST /upload.php HTTP/1.0\r\n");                // ïðàâèëüíî ëè?
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Host: ");                          
    strcat(mymessage,"localhost");
    strcat(mymessage,"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Referer: http://localhost/\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Content-Type: multipart/form-data;\n\tboundary=----------164756348538\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Content-Length: "); // äîëæíà ïåðåäàâàòüñÿ âñÿ äëèíà òåëà POST-çàïðîñà
    ultoa(mysize,mystrsize,10);
    strcat(mymessage,mystrsize);
    strcat(mymessage,"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Connection: close\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Cache-control: no-cache\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"------------164756348538\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Content-Disposition: form-data; name=\"userfile\"; filename=\"");
    strcat(mymessage,myfilename);
    strcat(mymessage,"\"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {    res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Content-Type: application/octet-stream\r\n");  
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {    res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"Content-Transfer-Encoding: base64\r\n\r\n"); 
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    sendres = send(sock,CodedData,mysize,0);    // îòïðàâëÿåì ôàéë íà ñåðâåð
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"\r\n------------164756348538--\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    recv_len = recv(sock,recv_buf,strlen(recv_buf),0); // ñ÷èòûâàåì îòâåò ñ ñåðâåðà
    if (recv_len<=0)
    // åñëè äëèíà îòâåòà ìåíüøå èëè ðàâíà íóëþ
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Îøèáêà ïðèåìà îòâåòà ñ ñåðâåðà","Îøèáêà",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    recv_buf[recv_len] = '\0';
    MessageBox(NULL,(LPCTSTR)recv_buf,"Îòâåò ñåðâåðà",MB_OK); 
    // åñëè íèêàêèõ îøèáîê íå ïðîèçîøëî
    closesocket(sock);
    WSACleanup();
    delete []CodedData;
    return  TRUE;
} // êîíåö ôóíêöèè MySendFile


Посылаемый файл принимается на сервере в нужном каталоге. smile
Но у меня в связи с этим возник такой вопрос: поскольку я использую кодирование бинарного файла по методу base64, то у меня этот файл становится больше примерно в 1,3 раза. И на сервере размер этого файла оказывается равным этой величине, а не исходному своему значению. Должно ли так быть или всё-таки на сервере после пересылки файл должен иметь свой исходный размер?
Если второй ответ, то что мне надо исправить?


Это сообщение отредактировал(а) erslgoeirjh - 16.12.2005, 18:55
PM MAIL   Вверх
Aleksandor
Дата 16.12.2005, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: нет
Всего: 12



Я так понял что на сервере он обратно не декодируется? Думаю что файл на сервере должен быть точно таким же как оригинал до кодирования, а как же иначе?
Я не уверен что есть смысл кодировать файл в base64. По протоколу HTTP обычно передаются нормальные двоичные файлы, иногда сжатые zlib или gzip, но это уже на закуску smile

Иначе , если файл не декодируется сервером, то кто его будет декодировать??
Я бы попробовал "Content-Transfer-Encoding: 8bit"
и передать файл как есть, в натуре smile

Это сообщение отредактировал(а) Aleksandor - 16.12.2005, 19:21


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Aleksandor
Дата 18.12.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: нет
Всего: 12



erslgoeirjh как дела? Раз уж начал отвечать хочу еще добавить что многострочные команды лучше не надо применять в HTTP. В отличие от почтовых протоколов и NNTP в HTTP символы конца строки не гарантированы быть CRLF. Может быть только CR или LF или какой-то из них, не помню уж точно, но встречались такие серваки smile Правда очень редко.


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
erslgoeirjh
Дата 19.12.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Цитата(Aleksandor @ 16.12.2005, 19:16)
Я так понял что на сервере он обратно не декодируется? Думаю что файл на сервере должен быть точно таким же как оригинал до кодирования, а как же иначе?
Я не уверен что есть смысл кодировать файл в base64. По протоколу HTTP обычно передаются нормальные двоичные файлы, иногда сжатые zlib или gzip, но это уже на закуску smile

Aleksandor, совершенно верно!
Попытаюсь передать файл на сервер без кодирования base64 и посмотрю, что за результат получится.

У меня используется Uniserver 3.2 .
PM MAIL   Вверх
qBiN
Дата 21.12.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.12.2005

Репутация: нет
Всего: нет



Цитата
Если второй ответ, то что мне надо исправить?
скрипт принимающий данные =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.