LINUX.ORG.RU

неблокирующий сокет & poll()


0

0

Здравствуйте. В программе юзается сабж (т.к. коннект происходит сразу к нескольким серверам, и connect() не должна блокировать программу).

Опишу проблему: к примеру в poll() передается массив из 7 структур, 3 из которых имеют fd равным -1. poll() почему то возвращает 6.

При просмотре этих шести, поле revents не нулевое только у 2 структур (обязательно первых в массиве). netstat при этом показывает 4 established конекта, причем с непустым входным буфером.

При следующих выховах poll() ничего не меняется (между вызовами с сокетами ничего пока не делаю, т.е. входной буфер остается непустым), возвращает он также 6 и только две ненулевые структуры.

В чем может быть проблема? Вообще как вместе работают неблокирующий сокет и poll()? Или как я сделал в принципе и не должно работать?

anonymous

Попробовал на блокирумом сокеты - то же самое.

P.S. для poll() я создал свою структуру, начало которой полностью соотвествует оригинальной, а дальше идут мои поля. При вызове poll() делаю преобразование указателя. Как я понимаю это не может повлять на корректность работы poll()?

anonymous
()

Идей нету?

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

>для poll() я создал свою структуру, начало которой полностью соотвествует оригинальной, а дальше идут мои поля. При вызове poll() делаю преобразование указателя. Как я понимаю это не может повлять на корректность работы poll()?

а то что ты видиш разве не влияние твоего изобретения на poll??

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

>Может ли помочь epoll() ?

нет только доктор

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

А что в этом такого страшного? Я же передаю указатель, ну он обращается к тем полям, что ему надо. А сколько всего памяти в переданной ему структуре - разве это имеет значение?

Попробовал с его "родной" структурой - более правдоподобно получилось - poll() возвращает два. Хотя установленных соединения - 4, и у всех на входе есть данные. Почему так ? Причем, для двух соединение есть флаг, что данные пришли, а для одного срабатывает ошибка (значенеи revents = 11826).

В общем подскажите, что я могу делать неправильно...

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

>В общем подскажите, что я могу делать неправильно...

тебе после чегото надо мозги промыть. посоветовал бы чем еслиб смог определить после чего.

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

Мне не совсем понятно, чем я дал Вам повод в таком тоне со мной разговаривать.

Я вроде бы описал свою проблему корректно. Перед тем как писать сюда, я попробовал разные варианты. Ок, могу согласиться, что создание своей структуры может вызывать некорректность в работе poll(). Но почему при использовании его родной структуры происходят такие странности? Да, я не силен в сетевом программировании, и с poll() связался в первый раз. Поэтому и спрашиваю здесь, что я делаю не так.

P.S. причем здесь MFC? Какая часть из моих постов может дать ассоциацию с MFC? Или "настоящие" юниксовые программеры всегда все знают с рождения, или настолько умны, что не делают ляпов и ошибок? Возможно, но люди бывают разные, и я думаю стоит терпимей относиться.

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

ну знаеш я видел много дилетантов и всяких разных.

ты ни накого из них не похож и находишся под влиянием какойто крайне странной парадигмы.

С - слишком деревянный язык чтобы телепатически читать мысли программиста а именно это ты пытаешся его заставить. отсюдова моя реакция.

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

а man poll читал???

а результат poll обрабатываеш??

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

Можешь не поверить - я пишу недолго, но исключительно под линух. Ок я в принципе решил проблему.

Я думаю к вашему огромноу багажу опыта мое решение ничего не добавит. Спасибо, что "пытались" мне помочь.

P.S. Ничего личного, просто немного неприятно. К тому же, вы мне часто помогали.

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

Ман ессно читал, и про результат я и говорил, что возваращлось 6 вместо 4. А что плохого устанавливание fd в -1 ? Как говорилось в доке про сравнение select() и poll() - при выставлении fd в -1 поле не учитыватся вызовом poll().

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

If the value fd is less than zero, events is ignored and revents is set to 0 in that entry on return from poll

http://docsrv.caldera.com:507/en/man/html.S/poll.S.html

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

это ман для SCO. линуксовый man такого не содержит следовательно я бы не пытался искушать судьбу

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

Also, with original implementations (SVR3) you could not set the descriptor to -1 to tell the kernel to ignore an entry in the pollfd structure, which made it hard to remove entries from the array; SVR4 gets around this.

Признаюсь, не могу точно перевести "SVR4 gets around this"

http://www.manualy.sk/sock-faq/unix-socket-faq-2.html

Если же нельзя (переносимость не интересует, все затачивается под линух), то как же делать? Делать сдвижки в массиве очеень накладно.

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

>Если же нельзя (переносимость не интересует, все затачивается под линух), то как же делать? Делать сдвижки в массиве очеень накладно.

практически все формируют временные массивы или делают врапперы вокруг poll.

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