![]() |
|
Модераторы: feodorv |
![]()
|
|
| erslgoeirjh |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
Здравствуйте, уважаемые участники форума!
Я пишу на Visual C++ клиент HTTP, который посылает на сервер бинарный файл методом POST. Имеется такой код:
Суть этой функции такова -- методом POST посылает на сервер бинарный файл (заданный параметром myfilename), предварительно закодировав его методом base64. При этом в блоке
возникает ошибка при передаче сообщения функцией send (но до этого вызовы send работают нормально). Код этой ошибки -- 10053. Одна из причин этой ошибки может быть в том, что я не правильно написал заголовок или тело метода POST. (Я некоторые части кода закомментировал для отлладки). В чём может быть причина этого? На моём компьютере стоит сервер UniServer, ниже приведён HTML-код страницы http://localhost/ :
Если посылать файл с помощью этой страницы, то посылка происходит успешно, а в результате неё в файле 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 |
||||||
|
|||||||
| Aleksandor |
|
||||||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: нет Всего: 12 |
Тут что-то напутано с заголовками...
Например строчка
должна выглядеть как
(без \r в середине строки, только \n) Еще непонятно зачем так много переводов строки в
В конце блока данных думается надо добавить 2 перевода строки, иначе граница прилепится к данным- вместо strcpy(mymessage,"------------164756348538--\r\n"); пишем strcpy(mymessage,"\r\n\r\n------------164756348538--\r\n"); IMHO протокол HTTP лучше взять для начала 1.0 - он проще. И надо проверить чтобы все соответствовало RFC Думаю нужно определиться с заголовками, расставить все по полочкам в соответствии с rfc, а отослать все буферы можно за один вызов WSASend. Это сообщение отредактировал(а) Aleksandor - 16.12.2005, 15:36 -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
||||||
|
|||||||
| Guest |
|
|||
|
Unregistered |
Aleksandor, а в каких RFC можно прочитать про формат команды POST? |
|||
|
||||
| erslgoeirjh |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
Aleksandor, а в каких RFC можно прочитать про формат команды POST? |
|||
|
||||
| Aleksandor |
|
||||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: нет Всего: 12 |
Ну например вот здесь http://www.codenet.ru/webmast/http/rfc2068/ есть неплохое описание. Еще можно посмотреть frc 1867 -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
||||
|
|||||
| erslgoeirjh |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
Aleksandor, я нашёл следующее:
http://www.phpclub.ru/detail/article/http_request#part_3_2 Насколько там верно приведены образцы POST-запроса? |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: нет Всего: 12 |
Да вроде все правильно
Честно говоря я с POST не работал , только с GET, но писал почтовый клиент типа theBat! - в принципе этот метод (POST) очень похож на работу с MIME. Главное не забывай что если команда многострочная, то делай только soft-breake (\n), иначе это будет уже как две разные команды, причем вторая неизвестная Попробуй разные варианты, возможно сервер не понял что-то и разорвал соединение... Лучше конечно печатать в файл все коммуникации-пригодится для отладки. -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| erslgoeirjh |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
Aleksandor, спасибо за советы. Теперь у меня клиент работает!
Вот его код:
Посылаемый файл принимается на сервере в нужном каталоге. Но у меня в связи с этим возник такой вопрос: поскольку я использую кодирование бинарного файла по методу base64, то у меня этот файл становится больше примерно в 1,3 раза. И на сервере размер этого файла оказывается равным этой величине, а не исходному своему значению. Должно ли так быть или всё-таки на сервере после пересылки файл должен иметь свой исходный размер? Если второй ответ, то что мне надо исправить? Это сообщение отредактировал(а) erslgoeirjh - 16.12.2005, 18:55 |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: нет Всего: 12 |
Я так понял что на сервере он обратно не декодируется? Думаю что файл на сервере должен быть точно таким же как оригинал до кодирования, а как же иначе?
Я не уверен что есть смысл кодировать файл в base64. По протоколу HTTP обычно передаются нормальные двоичные файлы, иногда сжатые zlib или gzip, но это уже на закуску Иначе , если файл не декодируется сервером, то кто его будет декодировать?? Я бы попробовал "Content-Transfer-Encoding: 8bit" и передать файл как есть, в натуре Это сообщение отредактировал(а) Aleksandor - 16.12.2005, 19:21 -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: нет Всего: 12 |
erslgoeirjh как дела? Раз уж начал отвечать хочу еще добавить что многострочные команды лучше не надо применять в HTTP. В отличие от почтовых протоколов и NNTP в HTTP символы конца строки не гарантированы быть CRLF. Может быть только CR или LF или какой-то из них, не помню уж точно, но встречались такие серваки
-------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| erslgoeirjh |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
Aleksandor, совершенно верно! Попытаюсь передать файл на сервер без кодирования base64 и посмотрю, что за результат получится. У меня используется Uniserver 3.2 . |
|||
|
||||
| qBiN |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.12.2005 Репутация: нет Всего: нет |
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |