|
#1
|
||||
|
||||
Winsock2 Recv
День добрый.
Пишу свой маленький модуль для дальнейшего использования. Так вот, как работает recv например в Synapse или Indy? Я не пойму принцип как реализовано, дебажил, смотрел но так и не въехал. Как отделяются заголовки от кода страницы, парсят? Опишите как можно подробнее по этой теме. Работаю с TCP сокетом. Последний раз редактировалось Xotabu4, 11.02.2014 в 17:42. |
#2
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 11.02.2014 в 18:42. |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Xotabu4 (11.02.2014)
|
#3
|
||||
|
||||
Ага, значит нужно выполнять цикл пока не получим $0d$0a.
С этим разберусь значит. Спасибо. Кто знает ответы на оставшиеся вопросы? |
#4
|
||||
|
||||
а можно считывать позаголовочно, т.е. текст заканчивающийся на $0d$0a. тогда пустая строка (только $0d$0a) будет концом заголовков.
а что еще за вопросы? Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Xotabu4 (11.02.2014)
|
#5
|
||||
|
||||
Цитата:
как работает recv например в Synapse или Indy? Вообще как правильно получать данные для TCP? И для чего в synapse перед recv такая строка? PHP код:
На msdn сказано следующее Цитата:
Последний раз редактировалось Xotabu4, 11.02.2014 в 19:42. |
#6
|
||||
|
||||
да, флаг FIONBIO функции ioctlsocket устанавливает режим работы сокета блокирующий (синхронный) или неблокирующий (асинхронный).
для чтения данных из сокета есть функция: Код:
int recv ( SOCKET s, char FAR* buf, int len, int flags ); Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Xotabu4 (12.02.2014)
|
#7
|
||||
|
||||
за функцию recv я знаю.
Значит суть такова? - Пройтись циклом по строкам - Проверить, попалось ли нам два раза #13+#10 - Вывести результат. И что дает флаг FIONREAD функции ioctlsocket? |
#8
|
||||
|
||||
Цитата:
используется для определения количества байт, которые можно считать из сокета. пример алгоритма: -считывать данные из сокета во временный буфер, пока не встретится последовательность 0x0d0x0a -сама последовательность 0x0d0x0a во временный буфер не добавляется -если строка не пустая, то она из временного буфера добавляется к списку заголовков, буфер очищается и повторяется чтение из сокета -если строка пустая, все заголовки приняты Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Xotabu4 (12.02.2014)
|
#9
|
||||
|
||||
И такой еще интересующий меня вопрос, как правильно составить алгоритм получения всех данных из recv, а именно заголовки и код страницы.
Мои предположения: - Winsock2.IoctlSocket(FSocket, FIONREAD, u_long(Res)) - Проверяем не вернул ли нам IoctlSocket > 1024 если да, ограничим его. - Циклом вызываем recv - Выполняем цикл пока recv не вернет 0 или ошибку - Выводим результат верно? |
#10
|
||||
|
||||
размер данных передается в заголовке Content-Length, либо данные передаются чанками, когда Transfer-Encoding: chunked
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Xotabu4 (12.02.2014)
|
#11
|
||||
|
||||
Значит вызывать recv до тех пор пока не получим размер принятых данных = Content-Length ?
|
#12
|
||||
|
||||
ну да, если заголовок Content-Length есть.
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Xotabu4 (12.02.2014)
|
#13
|
||||
|
||||
сейчас попробую, спасибо)
|