|
|
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
Работаю с почтовым сервером по pop3 протоколу. Делаю recv по частям. Как узнать, что серверу больше нечего мне передать? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Я расчитываю на то, что если результат положительный (0 - разрыв соединения - не рассматриваем) и равен размеру переданного буфера, то есть еще данные. Если результат положительный и меньше размера буфера, то это последняя часть данных. Посылаю команду "top 1 0", чтобы получить заголовок письма. В результате в отладчике сервер успеевает послать все данные так, как я рассчитываю. А при работе без отладчика в первый ответ успевает поместиться только первая строка!!! Т.е., в буфер из 256 байт сервер пишет 21 байт, и я не знаю, как определить, конец ли это. В принципе, я знаю, что хочу получить, и могу определить по содержимому ответа. Ну а что, если это не pop3, и в ответе находятся абстрактные бинарные данные?!?! Где собака зарыта? ───────── ∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 17:47 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
(`ykaЯ расчитываю на то, что если результат положительный (0 - разрыв соединения - не рассматриваем) и равен размеру переданного буфера, то есть еще данные. Если результат положительный и меньше размера буфера, то это последняя часть данных. А вот и неверно... Серверу может вполне есть чего передать, да только оно пока в проводах затерялось... В POP3, если мне память не изменяет конец передачи = это <СR><LF>+".."+<СR><LF> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 17:53 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
А вообще-то, recv не обязан ждать, чтобы забить весь буфер, который ему отдали под данные. И ошибки при этом нету... Сколько на данный момент в буфер сокета пришло, столько recv и вернет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 17:56 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
Исходя из реального поведения функции это и так понятно. Не понятно, как выкручиваться! Проблема в том, что вызов recv тогда, когда серверу действительно нечего сказать, ставит прогу раком и ждет данных. ───────── ∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 18:04 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
(`ykaИсходя из реального поведения функции это и так понятно. Не понятно, как выкручиваться! Проблема в том, что вызов recv тогда, когда серверу действительно нечего сказать, ставит прогу раком и ждет данных. Гы... Выкручиваться - WSAAsyncSelect-ом. или выделением цикла в отдельный поток. Как вариант - цикл ожидания, а внутри Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 18:24 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
WSAAsyncSelect посмотрю, спасибо. А цикл обработки сообщений, ИМХО, не обязан провозиться до тех пор, пока сервер не будет готов заслать весь буфер. ───────── ∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 18:30 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
(`ykaWSAAsyncSelect посмотрю, спасибо. А цикл обработки сообщений, ИМХО, не обязан провозиться до тех пор, пока сервер не будет готов заслать весь буфер. А для этого есть проверочка на размер пришедших данных, чтобы recv не подвисал на пустом буфере. См. ioctlsocket. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 19:16 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
В протоколе описано, что top... заканчивается строкой с одной точкой + CRLF вот ее и нужно ждать, как окончание передачи. а для ожидания можно использовать select ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 01:24 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
(`ykaРаботаю с почтовым сервером по pop3 протоколу. Делаю recv по частям. Как узнать, что серверу больше нечего мне передать? Это, по любому, задача протокола, а не recv. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 10:06 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
(`yka....А цикл обработки сообщений, ИМХО, не обязан провозиться до тех пор, пока сервер не будет готов заслать весь буфер.... если у Вас канал потоковый - то не корректно думать о порциях данных..нужно предпологать что это поток, очередь, файл...как угодно (и удобней)...поп 3 распологается над TCP/IP, а последний - есть потоковый протокол... соответственно и нуна подходить к пересылке данных. Как вариант - маркер начала, маркер хвоста.. По ним ориентируемся на формирование "внутреннего" пакета задания. Во флагах приёмника есть флаг (вернуть размер, без выемки) - используйте его для детекции размера пришедшей пачки... В пачке может содержаться полтора, 105, и мульён с хвостиком "внутренних" пакетов заданий... всё остальное - от лукавого... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 13:47 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
kolobok0поп 3 распологается над TCP/IP, а последний - есть потоковый протокол... соответственно и нуна подходить к пересылке данных. Гыыы... Ну например, ftp - тоже ходит поверх TCP/IP... И что? Его дата сокет получает все вплоть до обрыва соединения... И никаких маркеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 19:01 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
Makar4ik Гыыы... Ну например, ftp - тоже ходит поверх TCP/IP... И что? Его дата сокет получает все вплоть до обрыва соединения... И никаких маркеров. В Эфтипи, есть маркер начала файла. Может быть там и находяться данные о его размере. Тогда маркер конца файла не обязателен, но совсем не помешал бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 10:19 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
вообще у ftp есть код ответа "226 Transfer complete" и другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:26 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
хотя это не маркер датасокета конечно - но хотя бы можно утверждать, что все получили ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:29 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
--null--вообще у ftp есть код ответа "226 Transfer complete" и другие. Вот, вот. Поэтому, надо разбираться с протоколом, а не извращаться над сокетами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:48 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
AkhВ Эфтипи, есть маркер начала файла Да? Вот новость-то... И где же он лежит? RTFM официальная спецификация FTP --null--вообще у ftp есть код ответа "226 Transfer complete" и другие. Да, вот только приходит он по другому коннекшну. --null--хотя это не маркер датасокета конечно - но хотя бы можно утверждать, что все получилис определенной степенью допущения можно... Но как всегда есть несколько тонкостей. Во-первых, очень многие "недоделанные" ftp серверы при выкачке больших файлов полагают, что у командного сокета наступил таймаут, и обрывают его. Соответственно, никому ничего по нему не приходит. А во вторых, это все-таки разные соединения с сервером, и вообще, они могут быть соединены через разные промежуточные узлы сети. Так что даже пришедший 226 не означает, что по другому сокету все уже дошло... Да и к тому же, сервер шлет 226 и тогда, когда от юзера пришла команда ABOR... 226 означает всего лишь, что сервер датасокет закрыл, и на его стороне все шито-крыто. А что там до клиента долетело - не его проблемы. Единственный способ при этом понять, что все дошло - проверять размер файла, и сравнивать его с размером из листинга удаленного каталога. Тогда с достоверностью 99.95% можно будет сказать, что скачали... И все равно, 100% гарантий при этом нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 12:07 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
Makar4ik... Вывод тот же - это протокольный уровень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 12:12 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
но он же (сервер) если закрыл датасокет - то наверное значит, что пришли все квитанции с клиента? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 12:17 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
Akh Makar4ik... Вывод тот же - это протокольный уровень. Кто же спорит-то... Просто наличие - отсутствие "маркеров" - тоже от протокола зависит. --null--но он же (сервер) если закрыл датасокет - то наверное значит, что пришли все квитанции с клиента? Нет. Командный сокет может полчаса назад быть оборван как всегда, блин, по таймауту, а датасокет - только что, по любой другой причине. И не зная реального размера файла (ну позабыл я перед выкачкой спросить листинг каталога), поди догадайся, все ли пришло... А еще, по командному сокету могла прийти команда ABOR, а послать я ее мог час назад... Результат тот же... Боль-мень нормальные ftp клиенты (MSIE в частности) просто молча переконнекчиваются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 12:32 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
Makar4ik Akh Вывод тот же - это протокольный уровень. Кто же спорит-то... Просто наличие - отсутствие "маркеров" - тоже от протокола зависит. Я так понимаю, речь идет еще про pop3... Так вот, я не думаю, что этот протокол кривой, раз с ним работают большенство серверов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 13:14 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
Кстати, еще раз про FTP: посылаю на сервер "LIST /" тут же по командному каналу приходит ответ: "150 Opening ASCII mode data connection for /bin/ls.<CR><LF>226 Transfer complete." А тем временем, слушающий сокет на моей стороне даже еще не сделал accept приходящего дата сокета (не PASV режим)! О как! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 14:32 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
Мдя, жульничество :-) Похоже, в этом случае командному соединению полностью плевать на процесс, оно просто "для галочки" отрабатывает. Кстати интересно, как это согласовывается с RFC? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 14:49 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
А противоречия нету... Команда отработала, а уж какие там данные пришли - не головная боль протокола. Но в общем-то это не жульничество, а очень даже хорошая штука. Сервер делает это для повышения скорости работы, и это правильно. Обычный клиент сначала выкачает данные, потом проверит ответ, потом пошлет новую команду. Умный клиент если надо зашлет новую готовую комадну из очереди, при этом не дожидаясь полного прихода данных от прошлой команды. Таким образом можно на один командный канал организовать грубо говоря полтора канала данных. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 15:13 |
|
||
|
Сокеты. Как народ выкручивается?!
|
|||
|---|---|---|---|
|
#18+
просто тут "226 Transfer complete" подтвердил, что complete прием команды по командному соединению и ничего более. но все равно imho даные медленнее текут (в смысле они больше) и поэтому выигрыш в скорости не очень большой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 15:41 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34042075&tid=2030330]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
230ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 523ms |

| 0 / 0 |
