![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Работаю с POP3. Если получен весь ответ сервера (т.е. строка [server_answer\r\n]), то recv виснет, а потом отваливается по таймауту (:recv возвращяет 0). Можно как-то отловить конец ответки - "\r\n"?
Что здесь можно сделать? Желательно без BOOST.
Такая же проблема http://www.cyberforum.ru/visual-cpp/thread11542.html |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
оно не виснет, оно ждет, передающая сторона скорее всего передает меньше 20 байт
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Я согласен, так оно и есть. Мне надо, чтоб ::recv сразу вернула управление программы, а не ждало. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
||||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Типа так?
Добавлено @ 09:49 Какой порядок вызовов:
Это сообщение отредактировал(а) Alca - 24.6.2009, 09:53 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Alca
Установить можно 1 раз, после accept -а, он таким и останется. |
|||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
accept -а у меня нет. Добавлено через 3 минуты и 20 секунд ::ioctlsocket после этого? после того как создал сокет?
|
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Alca
не важно где, можно устанавливать 1 раз, после этого сокет станет неблокирующим. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
Вертает количество доступных байт для чтения... В топку неблокирующие сокеты... Это сообщение отредактировал(а) GrayCardinal - 24.6.2009, 15:10 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Прикольно |
|||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
В топку тогда еще и ioctl с дополнительным системным вызовом. |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 1 Всего: 18 |
Вот есть маленький примерчик (рабочий) принятия сообщений...
=====================================================
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Можно по-подробнее про дополнительные системные вызова?
|
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
При неблокирующих сокетах и select(), за один системный вызов можно проверить состояние множества сокетов. При использовании ioctl(FIONREAD), придется для каждого сокета делать системный вызов. При использовании select, процесс спит до наступления события. При использовании ioctl придется самому усыплять или как-то иначе занимать процесс и самому ловить момент когда сделать вызов. Системный вызов это дорогая операция и лишний раз ее лучше не делать. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
vinick,
Кто мешает делать select + FIONREAD на блокирующих ? Добавлено через 2 минуты и 25 секунд vinick, ИМХО, ты бредишь ![]() Это сообщение отредактировал(а) GrayCardinal - 25.6.2009, 13:17 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Бывает такое, что функция возвращяет пустую строку.
При дисконнекте POP3 сервера, сокет (::recv) не успееват получить ответ, т.е. ответка сервака не приходит. Что делать?
Это сообщение отредактировал(а) Alca - 25.6.2009, 13:26 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Если таймаут больше (в 10 раз), то ответ приходит от сервера. Что делать?
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Пишу под винду.
![]() |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
![]() |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Понял.
Добавлено @ 14:24
fd это чего? Добавлено через 7 минут и 11 секунд сокет? Это сообщение отредактировал(а) Alca - 25.6.2009, 14:25 |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
Здравый смысл. Зачем делать столько лишних телодвижений? перевести сокет в неблокирующий режим достаточно 1 раз при создании. А FIONERAD надо будет дергать постоянно. Ага брежу я и толпы разработчиков сетевых библиотек. Лишь ты несешь нам свет истины. |
|||
|
||||
fry |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Alca
Мой тебе совет: лучше не начинай писать того, что сам не понимаешь как работает. Вначале сам почитай книгу какую нибудь, тогда вопросы такого рода тебя уже мучить не будут. Данная тема не очень простая, в ней куча мелочей, без знания которых ты так и будешь задавать такого рода вопросы, а когда получишь готовое приложение у тебя не будет уверенности в его стабильной работе (иными словами "протянет ноги" в самый ненужный момент). Думаю полезно будет прочитать Стивенса, хотя бы начало. В ней изложены основные модели сетевых приложений. Добавлено через 3 минуты и 8 секунд Alca
Расшифруй пожалуйста. |
||||
|
|||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
После
sRes - пустая строка (должен быть ответ от POP3 сервера) Добавлено через 3 минуты и 34 секунды Если таймаут маленький (1000000 / 10) то нет ответки а если порядка (1000000 / 10) * 10 то все ок. |
||||
|
|||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
А если данных еще нет в буфере сокета? (например пакет еще в сети)
По моему обработка ошибок вызова recv не очень правильная. И потом recv не гарантирует изъятие всех данных из буфера, поэтому и возвращает их количество. Классический вариант - это работа данного вызова в цикле с изменением смещения в буфере ввода на количество байт, возвращенное из данного вызова. Это сообщение отредактировал(а) fry - 25.6.2009, 16:18 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
del
Это сообщение отредактировал(а) Alca - 25.6.2009, 16:24 |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
Кому "надо будет" ? Это сообщение отредактировал(а) GrayCardinal - 25.6.2009, 16:31 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
В том то и дело, что при блокирующем сокете ф-я ::recv - не возвращает управление программе, а при неблокирующем (если маленький таймаут), то ф-я ::recv не "успеевает" принять данные из сокета. |
|||
|
||||
fry |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Почитай книгу Стивенса и посмотри как сделано. (Книга есть в инете)
Возвращает, в случае блокировки по изменению состояния сокета. Это сообщение отредактировал(а) fry - 25.6.2009, 16:49 |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Накатай примерчик
|
|||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Накатал... Примеров мля куча, загляни на allanswers.find Повторяться не буду, почитай книгу. |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Все равно нет ответа от сервера.... ![]() Это сообщение отредактировал(а) Alca - 25.6.2009, 21:14 |
|||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Alca, может данные просто дойти не успевают?
Пробовал вызывать CXTcpClientSocket::sRecvBytes через некоторые промежутки времени? |
|||
|
||||
Alca |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
::ioctlsocket говорит что нет данных для чтения
хотя ответ от сервера еще не пришел.
До ::recv дело не доходит |
||||||
|
|||||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Если я принимаю данные большого размера (файл) в буфер фиксированого размера:
Кол-во принятых байт будет всегда равно размеру принимающего буфера или нет (я не беру, тот факт, что концовка данных (файла) будет меньше размера буфера, это и так ясно) ?
|
||||
|
|||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
нет, не так.
Функция чтения из сокета не обязанна возвращать значение считанных байт, равное требуемому. Именно для обработки данного условия она это значение и возвращяет. Представь себе ситуацию, что ты передаешь фильму метров эдак на 500. Естественно она вся в буфер приема ОС для этого сокета не влезет. Тогда как спрашивается функция приема данных вернет тебе запрошенные у нее 500 метров? Чтобы считать данные необходимо выделить буфер, запросить все данные, функция вернет значение считанных байт, если оно меньше требуемого, то корректишь входные данные функции в соответствии с ним (корректируешь смещение в буфере на возвращенное значение и уменьшаешь значение количества байт на считывание) и т.д.. Иными словами необходимо вызывать функцию приема данных такое количество раз, которое обеспечит тебе необходимое количество байт данных. Если сокет будет неблокируемым, то пр и этом будет очень много итераций. Неблокированный сокет тебе пригодится если необходимо обеспечить некоторое количество соединений, но алгоритм будет несколько иной. Можешь породить поток, где вызовешь функцию на блокируемом сокете. Некоторые параметры работы данного алгоритма можно настаивать. Я уже посоветовал книгу ("UNIX. Разработка сетевых приложений", Стивенс) - в ней все есть. Это сообщение отредактировал(а) fry - 26.6.2009, 15:08 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Хм.... Кажись я близок к цели.....
![]() Смотрю, я первую ответку сервера, которая пришла типа не полностью.... Как вы думаете, какой размер этих данных? 1024 байта. Следов. сервак шлет мне эти данные блоками по 1024 байт. Ну поставил я у себя такой же размер буфера и все заработало. Вот код:
Добавлено через 1 минуту и 3 секунды Но как быть если размер буфера у меня не 1024 байта? ![]() |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
Я рад за тебя... ![]() |
|||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
в одном пакете TCP умещается около 1500 байт
|
|||
|
||||
Alca |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Но как быть если размер буфера у меня не 1024 байта? Добавлено через 1 минуту и 23 секунды
|
||||||
|
|||||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
Alca,
А в репу ? ![]() Добавлено через 19 секунд ЗЫ ради приличия хотя бы по RTF эмь |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |