LINUX.ORG.RU

poll на кол-во байт


0

2

Всякие select и poll умеют работать только с таймаутами, что не очень удобно при работе с tcp-соединением... Т.е. при получении одного байта мне уже сообщают, что мол POLLIN, а мне нужно, чтобы в сокете было некоторое минимальное кол-во байт.

Как дождаться нужного кол-ва байт без while(){usleep();} ?

★★

Ответ на: комментарий от Olegymous

The select(2) and poll(2) system calls currently do not respect the SO_RCVLOWAT setting on Linux.

true_admin ★★★★★
()

Попробуй libev или libevent, там есть low watermark на буфера. Это, конечно, userspace-решение проблемы.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

гм... ну, в юзерспесе я могу и сам, while'ом набрать нужное кол-во данных)

Сокет ведь нельзя закрыть, если он в recv подвис? Помню, что обгуглися и понял, что никак нельзя, только select/poll или NONBLOCK, а тут блин еще одна трабла перпендикулярная вылезла...

kulti ★★
() автор топика
Ответ на: комментарий от kulti

Сокет ведь нельзя закрыть, если он в recv подвис?

можно. Из другого треда, например. Но лучше подумай о неблокируемом выводе.

while'ом набрать нужное кол-во данных)

это лишние телодвижения. Если ты ещё не смотрел что умеют те либы(libev) то самое время ознакомиться чтобы не изобретать велосипед.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

можно. Из другого треда, например. Но лучше подумай о неблокируемом выводе.

как? я набросал тестовый пример (правда для udp-сокета) - ничего не вышло.

это лишние телодвижения. Если ты ещё не смотрел что умеют те либы(libev) то самое время ознакомиться чтобы не изобретать велосипед.

Я уже смотрю libev, правда пока не нашел то, о чем вы говорили

kulti ★★
() автор топика
Ответ на: комментарий от true_admin

пример

Есть у меня приложение, которое с мультикаста поток хавала, но тут понадобилось и по http те же данные получать. В udp-то все просто: если пакет пришел, то он правильного размера. А по tcp приходится ждать, пока не наберется нужное кол-во данных в сокет.

PS. можно, конечно)

kulti ★★
() автор топика
Ответ на: комментарий от kulti

прога не собирается, не могу проверить. У меня есть подозрение что ты не на линухе её разрабатываешь потому что не хватает многих хедеров.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Линукс у меня - инфа 100%

$ g++ test.c -lpthread - ни на что не ругается. Специально скачал и еще раз попробовал

kulti ★★
() автор топика
Ответ на: комментарий от kulti

Ну вы бы предупредили, что нужен С++, а то для gcc нужно дописать «struct» в нескольких местах. И добавьте «\n» в строку вывода результата close().

Используйте shutdown(). http://www.gnu.org/s/libc/manual/html_node/Closing-a-Socket.html

mky ★★★★★
()
Ответ на: комментарий от kulti

Ммм, сорри, нет времени сейчас помогать. Дедлайны горят, поэтому на лоре чисто чтобы моск разгрузить. Но я там не увидел ни одного куска кода из C++, это всё же сишный код(исключая объявление структур без слова struct) на 110% :).

true_admin ★★★★★
()

> Как дождаться нужного кол-ва байт без while(){usleep();} ?

recv + MSG_WAITALL

anonymous
()
Ответ на: комментарий от kulti

> В udp-то все просто: если пакет пришел, то он правильного размера.

да ну?

unC0Rr ★★★★★
()
Ответ на: комментарий от mky

Ну вы бы предупредили, что нужен С++

Там переменный в середине кода объявляются - явно не С

И добавьте «\n» в строку вывода результата close()

Это же тестовый пример, написанный за 5 минут)

Используйте shutdown()

Ага, спасибо!

kulti ★★
() автор топика
Ответ на: комментарий от true_admin

Да ничего страшного, мне вон shutdown подсказали

Но я там не увидел ни одного куска кода из C++

Переменные в середине кода объявляются)

kulti ★★
() автор топика
Ответ на: комментарий от kulti

Переменные в середине кода объявляются)

без проблем и в C, если запустить gcc -std=gnu99

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.