LINUX.ORG.RU

Типовое решение при работе с сокетами

 ,


1

2

Есть в коде функция:

result = recvfrom(iSocket, array, BUF_SIZE, 0, (struct sockaddr *)&sipx, (socklen_t*)&len_addr) ;		
В результате ее работы в массиве array оказывается пакет размером BUF_SIZE. Есть ли какое-то стандартное решение при работе с этой функцией, чтобы постоянно принимать пакеты, да еще не все подряд а, отфильтрованные по значению в одном из элементов массива. Я пытался вот такой подход использовать:
do
   result = recvfrom(iSocket, array, BUF_SIZE, 0, (struct sockaddr *)&sipx, (socklen_t*)&len_addr) ;
while ( array[8] == 42 ) ;// принимать пакет пока в array не окажется то, что нужно
Устраивало, до тех пор, пока не потребовалось еще одному процессу читать через этот сокет.



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

Что-нибудь на коленке сварганю, чтобы обслуживать N клиентов в N потоков. Скажем, тупое эхо.

Неее, код должен отражать всю ту логику, что в задании приведена. Указана структура фрейма и логика работы сервера. Ну и ещё про 10 секундный таймаут не забудь.

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

Только я в твоем коде обещанного epoll не вижу.

Правильно, epoll() скрыт в недрах класса zMainLoop. В том то и смысл оберток, что они скрывают реализацию. Если бы ты видел epoll(), то это была бы уже прямая работа с системным вызовом. Такая задача стоит у тебя.

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

Я хотел показать, как много можно скрыть за обертками. И это очень сильно облегчает труд программиста.

Мы тут отделяем общую часть, и специфичную для конкретного сервера. Общая часть не привязана ни к какой конкретной задаче.

Написали один раз такую библиотек-обертку или взяли готовую типа Boost::Asio, а потом пишем только специфичный код для конкретной задачи. Удобно, ты концентрируешься только на прикладной логике, а не захламляешь текст программы кусками кода, которые повторяются (примерно), от одного сервера к другому.

Весь приведенный код, это ровно то, что мне бы понадобилось для решения указанной задачи. Указанные классы не эфемерны, они взяты из реальной библиотеки, которую я написал и использую для таких задач.

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

Иди нафиг! Я тогда тоже скрою все самое интересное и покажу тупо вершину.

Либо весь код, либо никакого.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от pathfinder

Я приведу то, что мне понадобилось бы написать, для реализации такого сервера имея сделанные ранее наработки по оберткам

Можно мне увидеть эти самый наработки? Можно мне рабочий код?

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

Все украдено до нас! Очень напоминает обсуждение проблемы обслуживания 10000 клиентов. Вот классическая статья http://www.kegel.com/c10k.html. Там рассмотрены разные стратегии решения. (кстати статье уже 15 лет). Там есть ссылки на примеры реализации и на С и на С++ и на Java

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

Мне надо ни мистический с10к, ни какой либо другой, а надо именно его код. Тем более с10к протух лет 10назад, ибо сейчас о чем-то кроме с500к активных соединений даже говорить не стоит.

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

Можно мне увидеть эти самый наработки? Можно мне рабочий код?

Не, я не хочу выкладывать. Там слишком много всего. Код явно не рассчитан на обучение и выкладывание и я считаю этот код своей интеллектуальной собственностью.

Если тема интересна, я может накатаю упрощенный вариант библиотеки, где все будет проще и понятнее и оформлю это в виде отдельного треда. Но обещать не могу. Я ленивый.

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

Не, я не хочу выкладывать.

Зря.

Там слишком много всего.

В этом и суть.

Код явно не рассчитан на обучение

Сомневаюсь, что есть хоть какой-то шанс, что твоей код меня может чему-то научить.

я считаю этот код своей интеллектуальной собственностью

Что из этого следует?

Если тема интересна, я может накатаю упрощенный вариант библиотеки, где все будет проще и понятнее и оформлю это в виде отдельного треда. Но обещать не могу. Я ленивый.

Ты мне хотябы wс -l выкати своих портянок.

Т.е. берёшь свою «интеллектуальную» собственность и считаешь в ней кол-во строк. Выкатываешь результат. Всё просто. Или это тоже «„интеллектуальную“ собственность»?

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