powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сокеты. Как народ выкручивается?!
25 сообщений из 25, страница 1 из 1
Сокеты. Как народ выкручивается?!
    #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
Сокеты. Как народ выкручивается?!
    #34020040
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(`ykaЯ расчитываю на то, что если результат положительный (0 - разрыв соединения - не рассматриваем) и равен размеру переданного буфера, то есть еще данные. Если результат положительный и меньше размера буфера, то это последняя часть данных.
А вот и неверно...
Серверу может вполне есть чего передать, да только оно пока в проводах затерялось...

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


─────────
∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙
...
Рейтинг: 0 / 0
Сокеты. Как народ выкручивается?!
    #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
Сокеты. Как народ выкручивается?!
    #34020175
Фотография (`yka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WSAAsyncSelect посмотрю, спасибо.
А цикл обработки сообщений, ИМХО, не обязан провозиться до тех пор, пока сервер не будет готов заслать весь буфер.


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

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


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


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


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

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

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

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

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

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

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

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

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

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


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

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

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

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


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