http post
От: Аноним  
Дата: 18.04.05 07:57
Оценка:
Добрый день!

Столкнулся с такой проблемой:
Клиент аплоадит файлы по http (wininet). Как исключить потерю данных при обрыве связи?

Если делать так:
-----------------------------------
#define PARTSIZE 4096

gethttpconnection(server, port);
openrequest(HTTP_VERB_POST...);

httpsetrequestEx(...)
for (i = 0; i < parts; i++)
{
chttpfile->write(&partData, PARTSIZE);

waitformultipleobjects(...)
{
//
}

partData += PARTSIZE;
}

endrequest();
-----------------------------------

то, при потере соединения до выполнения endrequest(), запрос не выполняется!



Пробовал по-другому:
(аплоадить каждую часть данных в отдельном http запросе)
-----------------------------------
for (i = 0; i < parts; i++)
{
gethttpconnection(server, port);

openrequest(HTTP_VERB_POST...);
httpsendrequestEx(...);
chttpfile->write(&partData, PARTSIZE);
endrequest();

partData += PARTSIZE;
}
-----------------------------------

— очень медленно Можно конечно большими кусками слать, но...думаю, это не совсем правильный выход.


Кстати, как корректно закрыть соединение. Например, что делать при закрытии приложения, если поток в этот
момент пишет большой блок данных (вся работа по передаче данных ведется в оддельном потоке)?
Re: http post
От: Аноним  
Дата: 18.04.05 20:51
Оценка:
очень нужно, укадите хотя бы направлние...
Re[2]: http post
От: Аноним  
Дата: 21.04.05 19:55
Оценка:
абыдно
Re: http post
От: zud Россия  
Дата: 29.07.05 16:39
Оценка:
Люди, хелп, может есть у кого соображения?
Re: http post
От: gbt Россия  
Дата: 29.07.05 17:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пробовал по-другому:

А>(аплоадить каждую часть данных в отдельном http запросе)
А>for (i = 0; i < parts; i++)
А>{
А>   gethttpconnection(server, port);

А>   openrequest(HTTP_VERB_POST...);
А>   httpsendrequestEx(...);
А>   chttpfile->write(&partData, PARTSIZE);
А>   endrequest();
   
А>   partData += PARTSIZE;
А>}


А>- очень медленно Можно конечно большими кусками слать, но...думаю, это не совсем правильный выход.

Почему же неправильный...
У вас соединение каждый раз устанавливается и рвется, а это довольно длительная операция, поэтому если попробовать так:

gethttpconnection(server, port);

for (i = 0; i < parts; i++)
{
   openrequest(HTTP_VERB_POST...);
   httpsendrequestEx(...);
   chttpfile->write(&partData, PARTSIZE);
   endrequest();
  
   partData += PARTSIZE;
}

То все должно быть довольно шустро, так как посылка запроса — штука не очень накладная (что там — десяток хеадеров и все).

Насчет завершения потока. Нужно разбивать на такие части (то есть вычислять parts) таким образом, чтобы время посылки одной части было достаточным для реакции потока на команду закрытия, ну а в цикле поставить проверку на Terminated:
for (i = 0; i < parts; i++)
{
    if (Terminated) break;
    ...
}

А в главном потоке устанавливать Terminated = true.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.