LINUX.ORG.RU

tcp сервер, select и таймаут

 , ,


0

4

Неблокирующий ТСР сервер на select`е. Подключаются писатель и читатель. Сервер принимает от писателя структуру с intами, сохраняет и отдаёт читателю при его подключении. Если писатель не подключается за время t, поля структуры становятся 0xffffffff и читатель различает таймаут писателя.

Если использовать один listen_fd на оба типа, то подключение читателя сбросит таймаут и не узнать о недоступности писателя.

Если listen_fd разные и в readfds внести listen_fd только писателя, то select не обработает подключение читателя. А если в fd_set включить listen_fd обоих, то подключение читателя опять обнулит таймаут.

На ум приходит fork(), где родитель при подключении читателя отправляет SIGUSR1 порождённому, а тот, принявший структуру от писателя или установивший её поля в 0xffffffff при таймауте, передаёт структуру родителю через pipe().

Как обработать ситуацию одним процессом, по возможности без тредов?


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

Ну ладно, уговорил, select лучше не использовать (чего я и делаю последние годы, а файлик для упрощённой работы с сокетами написал больше 10 лет назад). Но всё-таки по поводу списка уточню:

Ты пишешь код на C и не знаешь других языков;

Достаточно «не хочешь».

Код должен работать под лялексом И вендой, последняя обязательно без WSL и прочих cygwin;

Тут согласен - цель тогда была именно такая - везде сходу компилироваться и работать без малейшей дополнительной возни. В качестве «везде» имелся msvc 97 (без WSAPoll разумеется) и разные версии gcc под линуксом и фрибсд.

Тебе абсолютно нельзя использовать сторонние библиотеки, даже самые простые;

Верно - это и была «самая простая библиотека» из одного .c файла который потом везде можно сувать. Собственно до сих пор пользуюсь (хоть и не всем что в нём было задумано, поскольку совместимость с виндой уже почти не использую), изредка что-то дописываю в него. вот ссылка

При этом при всём, к производительности требования вообще нулевые (но зачем тогда тут C?) и код может терять соединения без проблем;

Не совсем так. Если у нас ничего кроме селекта нет - то вне зависимости от требований к производительности придётся использовать его. Если есть poll - будет он. А C затем что любимый язык. Про потерю соединений не надо: во-первых, на системах с селектом вряд ли будет запускаться что-то требовательное к количеству коннектов. Во-вторых, некий лимит коннектов есть у всех, хотя бы по kern.maxfiles или как оно там называется, а вообще обычно и в приложении (например в том же nginx это 50-100% от worker_connections*num_workers, а то и меньше, потом он их тупо дропает). То есть если соединений слишком много то теряться они всё равно будут где угодно, вопрос только выборе адекватного порога.

Срать мимо стека и засирать всю память, после чего дохнуть в корку можно, к этому вопросов нет (ах, вот зачем тут C!);

Ну это вообще мимо - я уже кучу раз объяснял что никакой опасности для битья стека и вообще памяти нет, если правильно писать код.

За лишний ifdef тебя расстреляют, количество ifdef отмерено специальным комитетом и их хватает ровно на WSASetError/WSAGetError/errno, но не на poll/WSAPoll.

Ну, почти так 🤡

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Проблема в том, что в лялексе ровно та же херня даже с сишным софтом. Я тут пытался одну прогу собрать, которая пару лет назад точно работала, а сейчас библиотеки обновились и хер там.

Вот и причина избегать лишних библиотек. Нет зависимости - она не сломает тебе сборку своим несовместимым обновлением.

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

Проблема в том, что в лялексе ровно та же херня даже с сишным софтом. Я тут пытался одну прогу собрать, которая пару лет назад точно работала, а сейчас библиотеки обновились и хер там.

Вот и причина избегать лишних библиотек. Нет зависимости - она не сломает тебе сборку своим несовместимым обновлением.

Там прога с гуем, есличо. Жду от тебя мастеркласса по разработке софта на голом Xlib.

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

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

Каким пользователям? Пользователям XP? Они все давно переехали на Windows 11, кроме сетевых сумасшедших, опасающихся что Cortana – ещё один выход еврейского тоннеля.

Хотя кстати тот код с селектом ещё в 2012 написан, даже по твоим дурацким критериям xp тогда было в поддержке.

Это время, когда ещё телеграма не существовало. Кому этот код сейчас нужен?

cumvillain
()
Ответ на: комментарий от i-rinat

Радуйся. Ведь весь остальной мир ударился в крайность в противоположном направлении. И теперь софт устаревает за год.

Это на другом спекте безумия, да. На стараться-то надо держаться где-то посередине.

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

Ну ладно, уговорил, select лучше не использовать (чего я и делаю последние годы, а файлик для упрощённой работы с сокетами написал больше 10 лет назад). Но всё-таки по поводу списка уточню:

Ты пишешь код на C и не знаешь других языков;

Достаточно «не хочешь».

Называется «не осилил».

Код должен работать под лялексом И вендой, последняя обязательно без WSL и прочих cygwin;

Тут согласен - цель тогда была именно такая - везде сходу компилироваться и работать без малейшей дополнительной возни. В качестве «везде» имелся msvc 97 (без WSAPoll разумеется) и разные версии gcc под линуксом и фрибсд.

Блиииин! Я вспомнил, откуда у тебя эта шиза!

зависимость выдаваемого асм-кода от нефункциональных вставок

Твою жеж мать! Это очень многое объясняет.

Срать мимо стека и засирать всю память, после чего дохнуть в корку можно, к этому вопросов нет (ах, вот зачем тут C!);

Ну это вообще мимо - я уже кучу раз объяснял что никакой опасности для битья стека и вообще памяти нет, если правильно писать код.

Правильно писать код – это не использовать select(), потому что FD_SET() срёт мимо буфера, если fd > 1024.

hateyoufeel ★★★★★
()