Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.02.2014, 17:08
Аватар для Xotabu4
Xotabu4 Xotabu4 вне форума
Прохожий
 
Регистрация: 05.07.2012
Сообщения: 9
Репутация: 10
По умолчанию Winsock2 Recv

День добрый.
Пишу свой маленький модуль для дальнейшего использования.

Так вот, как работает recv например в Synapse или Indy? Я не пойму принцип как реализовано, дебажил, смотрел но так и не въехал.

Как отделяются заголовки от кода страницы, парсят?

Опишите как можно подробнее по этой теме.
Работаю с TCP сокетом.

Последний раз редактировалось Xotabu4, 11.02.2014 в 17:42.
Ответить с цитированием
  #2  
Старый 11.02.2014, 18:39
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Xotabu4
Как отделяются заголовки от кода страницы
$0d$0a, которые означают пустую строку (после последнего заголовка идет $0d$0a $0d$0a).
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 11.02.2014 в 18:42.
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Xotabu4 (11.02.2014)
  #3  
Старый 11.02.2014, 18:52
Аватар для Xotabu4
Xotabu4 Xotabu4 вне форума
Прохожий
 
Регистрация: 05.07.2012
Сообщения: 9
Репутация: 10
По умолчанию

Ага, значит нужно выполнять цикл пока не получим $0d$0a.
С этим разберусь значит. Спасибо.

Кто знает ответы на оставшиеся вопросы?
Ответить с цитированием
  #4  
Старый 11.02.2014, 19:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а можно считывать позаголовочно, т.е. текст заканчивающийся на $0d$0a. тогда пустая строка (только $0d$0a) будет концом заголовков.
а что еще за вопросы?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Xotabu4 (11.02.2014)
  #5  
Старый 11.02.2014, 19:26
Аватар для Xotabu4
Xotabu4 Xotabu4 вне форума
Прохожий
 
Регистрация: 05.07.2012
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
а что еще за вопросы?

как работает recv например в Synapse или Indy? Вообще как правильно получать данные для TCP?
И для чего в synapse перед recv такая строка?

PHP код:
Winsock2.IoctlSocket(FSocketFIONREADu_long(Res)) 

На msdn сказано следующее

Цитата:
Ioctlsocket функция управляет режимом ввода / вывода сокета.
Как я понял функция для изменения режима на блокирующий сокет, и наоборот?

Последний раз редактировалось Xotabu4, 11.02.2014 в 19:42.
Ответить с цитированием
  #6  
Старый 12.02.2014, 10:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

да, флаг FIONBIO функции ioctlsocket устанавливает режим работы сокета блокирующий (синхронный) или неблокирующий (асинхронный).

для чтения данных из сокета есть функция:

Код:
int recv (
    SOCKET s,	
    char FAR* buf,	
    int len,	
    int flags	
   );
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Xotabu4 (12.02.2014)
  #7  
Старый 12.02.2014, 15:05
Аватар для Xotabu4
Xotabu4 Xotabu4 вне форума
Прохожий
 
Регистрация: 05.07.2012
Сообщения: 9
Репутация: 10
По умолчанию

за функцию recv я знаю.

Значит суть такова?
- Пройтись циклом по строкам
- Проверить, попалось ли нам два раза #13+#10
- Вывести результат.

И что дает флаг FIONREAD функции ioctlsocket?
Ответить с цитированием
  #8  
Старый 12.02.2014, 17:56
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
FIONREAD
Use to determine the amount of data pending in the network's input buffer that can be read from socket.
ioctlsocket function
используется для определения количества байт, которые можно считать из сокета.

пример алгоритма:
-считывать данные из сокета во временный буфер, пока не встретится последовательность 0x0d0x0a
-сама последовательность 0x0d0x0a во временный буфер не добавляется
-если строка не пустая, то она из временного буфера добавляется к списку заголовков, буфер очищается и повторяется чтение из сокета
-если строка пустая, все заголовки приняты
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Xotabu4 (12.02.2014)
  #9  
Старый 12.02.2014, 18:23
Аватар для Xotabu4
Xotabu4 Xotabu4 вне форума
Прохожий
 
Регистрация: 05.07.2012
Сообщения: 9
Репутация: 10
По умолчанию

И такой еще интересующий меня вопрос, как правильно составить алгоритм получения всех данных из recv, а именно заголовки и код страницы.

Мои предположения:
- Winsock2.IoctlSocket(FSocket, FIONREAD, u_long(Res))
- Проверяем не вернул ли нам IoctlSocket > 1024 если да, ограничим его.
- Циклом вызываем recv
- Выполняем цикл пока recv не вернет 0 или ошибку
- Выводим результат

верно?
Ответить с цитированием
  #10  
Старый 12.02.2014, 18:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

размер данных передается в заголовке Content-Length, либо данные передаются чанками, когда Transfer-Encoding: chunked
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Xotabu4 (12.02.2014)
  #11  
Старый 12.02.2014, 18:41
Аватар для Xotabu4
Xotabu4 Xotabu4 вне форума
Прохожий
 
Регистрация: 05.07.2012
Сообщения: 9
Репутация: 10
По умолчанию

Значит вызывать recv до тех пор пока не получим размер принятых данных = Content-Length ?
Ответить с цитированием
  #12  
Старый 12.02.2014, 18:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну да, если заголовок Content-Length есть.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Xotabu4 (12.02.2014)
  #13  
Старый 12.02.2014, 19:02
Аватар для Xotabu4
Xotabu4 Xotabu4 вне форума
Прохожий
 
Регистрация: 05.07.2012
Сообщения: 9
Репутация: 10
По умолчанию

сейчас попробую, спасибо)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter