Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сокеты. Как народ выкручивается?! / 25 сообщений из 25, страница 1 из 1
28.09.2006, 17:47
    #34020018
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Работаю с почтовым сервером по pop3 протоколу.
Делаю recv по частям.
Как узнать, что серверу больше нечего мне передать?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
do
{
	ResizeAnswerBuffer(answer_length ==  0  ?  256  : answer_buf_length +  1024 );
	tmp_buf_len = (int)(answer_buf_length - answer_length);
	if ((result = recv(s, answer_buf + answer_length, tmp_buf_len,  0 )) == SOCKET_ERROR)
	{
		if (WSAGetLastError() == WSAEMSGSIZE)
		{
			result = tmp_buf_len;
			answer_length += result;
			continue;
		}    
		result =  0 ;
		throw WSEString(WSAGetLastError());
	}
	answer_length += result;
}
while (result !=  0  && !(result < tmp_buf_len));

Я расчитываю на то, что если результат положительный (0 - разрыв соединения - не рассматриваем) и равен размеру переданного буфера, то есть еще данные. Если результат положительный и меньше размера буфера, то это последняя часть данных.
Посылаю команду "top 1 0", чтобы получить заголовок письма. В результате в отладчике сервер успеевает послать все данные так, как я рассчитываю. А при работе без отладчика в первый ответ успевает поместиться только первая строка!!! Т.е., в буфер из 256 байт сервер пишет 21 байт, и я не знаю, как определить, конец ли это. В принципе, я знаю, что хочу получить, и могу определить по содержимому ответа. Ну а что, если это не pop3, и в ответе находятся абстрактные бинарные данные?!?!
Где собака зарыта?


─────────
∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙
...
Рейтинг: 0 / 0
28.09.2006, 17:53
    #34020040
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
(`ykaЯ расчитываю на то, что если результат положительный (0 - разрыв соединения - не рассматриваем) и равен размеру переданного буфера, то есть еще данные. Если результат положительный и меньше размера буфера, то это последняя часть данных.
А вот и неверно...
Серверу может вполне есть чего передать, да только оно пока в проводах затерялось...

В POP3, если мне память не изменяет конец передачи = это <СR><LF>+".."+<СR><LF>
...
Рейтинг: 0 / 0
28.09.2006, 17:56
    #34020051
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
А вообще-то, recv не обязан ждать, чтобы забить весь буфер, который ему отдали под данные.
И ошибки при этом нету...
Сколько на данный момент в буфер сокета пришло, столько recv и вернет.
...
Рейтинг: 0 / 0
28.09.2006, 18:04
    #34020071
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Исходя из реального поведения функции это и так понятно. Не понятно, как выкручиваться! Проблема в том, что вызов recv тогда, когда серверу действительно нечего сказать, ставит прогу раком и ждет данных.


─────────
∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙
...
Рейтинг: 0 / 0
28.09.2006, 18:24
    #34020161
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
(`ykaИсходя из реального поведения функции это и так понятно. Не понятно, как выкручиваться! Проблема в том, что вызов recv тогда, когда серверу действительно нечего сказать, ставит прогу раком и ждет данных.


Гы...
Выкручиваться - WSAAsyncSelect-ом.
или выделением цикла в отдельный поток.

Как вариант - цикл ожидания, а внутри
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void ProcessMessages(void)
{
	MSG Msg;
    while (PeekMessage(&Msg,  0 ,  0 ,  0 , PM_REMOVE))	{
        if(Msg.message == WM_QUIT) ExitProcess( 0 );
		else{
			TranslateMessage(&Msg);
			DispatchMessage(&Msg);
		}
	}
}
...
Рейтинг: 0 / 0
28.09.2006, 18:30
    #34020175
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
WSAAsyncSelect посмотрю, спасибо.
А цикл обработки сообщений, ИМХО, не обязан провозиться до тех пор, пока сервер не будет готов заслать весь буфер.


─────────
∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙
...
Рейтинг: 0 / 0
28.09.2006, 19:16
    #34020312
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
(`ykaWSAAsyncSelect посмотрю, спасибо.
А цикл обработки сообщений, ИМХО, не обязан провозиться до тех пор, пока сервер не будет готов заслать весь буфер.

А для этого есть проверочка на размер пришедших данных, чтобы recv не подвисал на пустом буфере.
См. ioctlsocket.
...
Рейтинг: 0 / 0
29.09.2006, 01:24
    #34020610
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
В протоколе описано, что top...
заканчивается строкой с одной точкой + CRLF
вот ее и нужно ждать, как окончание передачи.
а для ожидания можно использовать select
...
Рейтинг: 0 / 0
29.09.2006, 10:06
    #34021031
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
(`ykaРаботаю с почтовым сервером по pop3 протоколу.
Делаю recv по частям.
Как узнать, что серверу больше нечего мне передать?


Это, по любому, задача протокола, а не recv.
...
Рейтинг: 0 / 0
29.09.2006, 13:47
    #34022113
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
(`yka....А цикл обработки сообщений, ИМХО, не обязан провозиться до тех пор, пока сервер не будет готов заслать весь буфер....


если у Вас канал потоковый - то не корректно думать о порциях данных..нужно предпологать что это поток, очередь, файл...как угодно (и удобней)...поп 3 распологается над TCP/IP, а последний - есть потоковый протокол... соответственно и нуна подходить к пересылке данных. Как вариант - маркер начала, маркер хвоста.. По ним ориентируемся на формирование "внутреннего" пакета задания. Во флагах приёмника есть флаг (вернуть размер, без выемки) - используйте его для детекции размера пришедшей пачки... В пачке может содержаться полтора, 105, и мульён с хвостиком "внутренних" пакетов заданий...


всё остальное - от лукавого...

с уважением
(круглый)
...
Рейтинг: 0 / 0
29.09.2006, 19:01
    #34023418
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
kolobok0поп 3 распологается над TCP/IP, а последний - есть потоковый протокол... соответственно и нуна подходить к пересылке данных.
Гыыы...
Ну например, ftp - тоже ходит поверх TCP/IP...
И что?
Его дата сокет получает все вплоть до обрыва соединения...
И никаких маркеров.
...
Рейтинг: 0 / 0
02.10.2006, 10:19
    #34025177
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Makar4ik
Гыыы...
Ну например, ftp - тоже ходит поверх TCP/IP...
И что?
Его дата сокет получает все вплоть до обрыва соединения...
И никаких маркеров.

В Эфтипи, есть маркер начала файла. Может быть там и находяться данные о его размере. Тогда маркер конца файла не обязателен, но совсем не помешал бы.
...
Рейтинг: 0 / 0
02.10.2006, 11:26
    #34025411
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
вообще у ftp есть код ответа "226 Transfer complete" и другие.
...
Рейтинг: 0 / 0
02.10.2006, 11:29
    #34025425
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
хотя это не маркер датасокета конечно - но хотя бы можно утверждать, что все получили
...
Рейтинг: 0 / 0
02.10.2006, 11:48
    #34025491
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
--null--вообще у ftp есть код ответа "226 Transfer complete" и другие.

Вот, вот. Поэтому, надо разбираться с протоколом, а не извращаться над сокетами.
...
Рейтинг: 0 / 0
02.10.2006, 12:07
    #34025566
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
AkhВ Эфтипи, есть маркер начала файла
Да?
Вот новость-то...
И где же он лежит?
RTFM официальная спецификация FTP

--null--вообще у ftp есть код ответа "226 Transfer complete" и другие. Да, вот только приходит он по другому коннекшну.
--null--хотя это не маркер датасокета конечно - но хотя бы можно утверждать, что все получилис определенной степенью допущения можно...
Но как всегда есть несколько тонкостей.
Во-первых, очень многие "недоделанные" ftp серверы при выкачке больших файлов полагают, что у командного сокета наступил таймаут, и обрывают его.
Соответственно, никому ничего по нему не приходит.
А во вторых, это все-таки разные соединения с сервером, и вообще, они могут быть соединены через разные промежуточные узлы сети. Так что даже пришедший 226 не означает, что по другому сокету все уже дошло...
Да и к тому же, сервер шлет 226 и тогда, когда от юзера пришла команда ABOR...
226 означает всего лишь, что сервер датасокет закрыл, и на его стороне все шито-крыто. А что там до клиента долетело - не его проблемы.

Единственный способ при этом понять, что все дошло - проверять размер файла, и сравнивать его с размером из листинга удаленного каталога.
Тогда с достоверностью 99.95% можно будет сказать, что скачали...
И все равно, 100% гарантий при этом нету.
...
Рейтинг: 0 / 0
02.10.2006, 12:12
    #34025590
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Makar4ik...

Вывод тот же - это протокольный уровень.
...
Рейтинг: 0 / 0
02.10.2006, 12:17
    #34025605
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
но он же (сервер) если закрыл датасокет - то наверное значит, что пришли все квитанции с клиента?
...
Рейтинг: 0 / 0
02.10.2006, 12:32
    #34025676
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Akh Makar4ik...
Вывод тот же - это протокольный уровень.
Кто же спорит-то...
Просто наличие - отсутствие "маркеров" - тоже от протокола зависит.

--null--но он же (сервер) если закрыл датасокет - то наверное значит, что пришли все квитанции с клиента?
Нет.
Командный сокет может полчаса назад быть оборван как всегда, блин, по таймауту, а датасокет - только что, по любой другой причине.
И не зная реального размера файла (ну позабыл я перед выкачкой спросить листинг каталога), поди догадайся, все ли пришло...

А еще, по командному сокету могла прийти команда ABOR, а послать я ее мог час назад...
Результат тот же...

Боль-мень нормальные ftp клиенты (MSIE в частности) просто молча переконнекчиваются.
...
Рейтинг: 0 / 0
02.10.2006, 13:14
    #34025831
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Makar4ik Akh
Вывод тот же - это протокольный уровень.
Кто же спорит-то...
Просто наличие - отсутствие "маркеров" - тоже от протокола зависит.


Я так понимаю, речь идет еще про pop3... Так вот, я не думаю, что этот протокол кривой, раз с ним работают большенство серверов.
...
Рейтинг: 0 / 0
09.10.2006, 14:32
    #34041750
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Кстати, еще раз про FTP:
посылаю на сервер "LIST /"
тут же по командному каналу приходит ответ:
"150 Opening ASCII mode data connection for /bin/ls.<CR><LF>226 Transfer complete."

А тем временем, слушающий сокет на моей стороне даже еще не сделал accept приходящего дата сокета (не PASV режим)!
О как!
...
Рейтинг: 0 / 0
09.10.2006, 14:49
    #34041822
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Мдя, жульничество :-)
Похоже, в этом случае командному соединению полностью плевать на процесс, оно просто "для галочки" отрабатывает. Кстати интересно, как это согласовывается с RFC?
...
Рейтинг: 0 / 0
09.10.2006, 15:13
    #34041916
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
А противоречия нету...
Команда отработала, а уж какие там данные пришли - не головная боль протокола.

Но в общем-то это не жульничество, а очень даже хорошая штука.
Сервер делает это для повышения скорости работы, и это правильно.

Обычный клиент сначала выкачает данные, потом проверит ответ, потом пошлет новую команду.
Умный клиент если надо зашлет новую готовую комадну из очереди, при этом не дожидаясь полного прихода данных от прошлой команды.
Таким образом можно на один командный канал организовать грубо говоря полтора канала данных. ;-)
...
Рейтинг: 0 / 0
09.10.2006, 15:41
    #34042008
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
просто тут "226 Transfer complete" подтвердил, что complete прием команды по командному соединению и ничего более.
но все равно imho даные медленнее текут (в смысле они больше) и поэтому выигрыш в скорости не очень большой.
...
Рейтинг: 0 / 0
09.10.2006, 15:56
    #34042075
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сокеты. Как народ выкручивается?!
Это если качать...
А если спрашивать листинг директорий?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сокеты. Как народ выкручивается?! / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]