![]() |
C++ функция recv зависает, сокеты, проблема
Пишу в обучающих целях простой граббер web-страниц. Открываю сокет, отсылаю заголовок функцией send. Далее начинается чтение ответа и самого кода странички функцией recv. Тут начинаются проблемы - после чтения предпоследней порции информации функция "переходит в режим ожидания" :( Флаг MSG_PEEK не помогает. Вопрос: как избежать этого виса, возможно ли поставить recv на таймаут? Приведите пожалуйста простой пример кода с решением.
Пока решаю это проблему так: в каждой порции ответа сервера ищу "\r\n\r\n", если нахожу более 2 раз - выход из цикла приема. |
Когда я с помощью send-recv работал с вебом, таких проблем не было. Просто я проверял, сколько байт считано (это и возвращает recv), и если это число равно 0, то цикл чтения закончен. Простой пример кода только на асме могу привести, на нем и писал)
Лучше бы показал свой код. |
Цитата:
|
Я так и пытался делать. Проблема в том, что если размер буфера чуть больше кол-ва оставшихся байт то он пытается что то читать (около минуты функция висит)
вот кусок кода PHP код:
|
Как вариант - использовать не keep-alive соединение, а close. Протокол надо использовать HTTP/1.0, а не 1.1, иначе придется парсить содержимое, так как сервер может отсылать его в этом случае кусками с Transfer-Encoding: chunked. Кстати, в файл надо писать не просто строку buff с помощью fputs, так как последний байт у нее необязательно нулевой, а следует использовать fwrite и явно указывать размер записываемого буфера.
Примерно так: PHP код:
|
Цитата:
|
а на счет таймаута для recv в моей статейке почитай
|
Content-Length!
|
2 _Great_ а если сервак еб*н*тый и непосылает Content-Length - тогда облом. )
|
При кипелайв соединении обязан. Иначе браузер никогда не узнает когда посылать запрос очередной.
А при клоуз - оно и не нужно. |
Хм может еще кто нибудь знает: есть в С++ аналог функции urlencode()? Для преобразования русских символов в url вид?
|
а самому написать?? банальный конверт в hex с добавлением с переди символа %
|
например
Код:
char *urlencode (char *str) { |
Цитата:
|
Я спросил не "почему нету" а "есть ли". Это разные вещи.
|
awdrg
Если знать, почему может, а почему не может быть, будешь заодно знать и есть ли. krypt3r Это что еще за пи##ец? Откуда sizeof(char*) ? Почему заполняется нулями только треть буффера - len+1 ? Зачем вообще заполнение нулями, если вызывается calloc? Почему код вообще на Си, когда просили на С++? В чем сакральный смысл приведения char* к тиму char*? Садись, два |
| Время: 11:46 |