Здравствуйте. Вот решил программировать сеть на низкоуровневой библе из "коробки" библиотек от linux! Вроде все складывается, но есть один момент, когда из слушающих сокетов ловиться соединение(accept), оно добовляется в набор для отслеживания еполл_вайтом и тут же возвращается с событием 4. Как? По логике если ты ко мне подключился, я жду от тебя "новостей" с цифрой 1. Вообще не понимаю этот баг, или у меня в мозгах какой то клин. Конечно игнорю это событие, но системный вызов работает, как от этого избавиться если допустим у меня запланированы частые обрывы tcp-соединения, этож пипец как накладно и не как не стыкуется с логикой, где я промахнулся?
когда из слушающих сокетов ловиться соединение(accept), оно добовляется в набор для отслеживания еполл_вайтом и тут же возвращается с событием 4. Как? По логике если ты ко мне подключился, я жду от тебя "новостей" с цифрой 1.
4 -- это EPOLLRDHUP? По логике, если ты принял входящее соединение, а другая сторона на нём сделала shutdown(…, SHUT_WR), чтобы данные могли идти только от тебя к клиенту, то такое поведение ты и получишь.
EPOLLOUT говорит о том, что туда можно писать, тут-то вообще нет никакой неожиданности. Если ты об этом знаешь, убери флажок EPOLLOUT когда добавляешь дескриптор в epoll set.
jcmvbkbc, в том флаге весь смысл! Просто, логика прожки основывается на этих 2-х событиях в режиме ЕТ. Не могу его убрать. Дело даже не в этом, вызовы еполл_вайт работают исправно, просто, после добавления дескриптора в набор, первое событие, которое получаешь, это EPOLLOUT, это примерно как кто то тебе звонит и ты первым от него слышишь "алло?".
Данил Тунев, ты знаешь, что ты можешь модифицировать флаги дескрипторов которые уже находятся в epoll set? Ну т.е. сразу после accept ты можешь добавить дескриптор только с флагом EPOLLIN, а уже когда запись в него вернётся с размером меньшим чем ты просил записать (или с EWOULDBLOCK если ты с ним работаешь в неблокирующем режиме) -- вызвать epoll_ctl и добавить флаг EPOLLOUT.
первое событие, которое получаешь, это EPOLLOUT, это примерно как кто то тебе звонит и ты первым от него слышишь "алло?".
аналогия не очень, на мой взгляд, потому что люди телефоном пользуются в симплексном полудуплексном режиме, т.е. обычно не говорят одновременно, и flow control телефонного разговора завязан на эту полудуплексность. Но в рамках этой твоей аналогии, это примерно как кто-то тебе звонит, а ты имеешь возможность сняв трубку сразу сказать "алло". Первый EPOLLOUT -- твоя возможность что-то сказать сразу.