powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Еще раз про сокеты...
25 сообщений из 34, страница 1 из 2
Еще раз про сокеты...
    #34041968
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ!

Кто-нибудь знает, есть ли в природе способ соединить два сокета без помощи третьего (т.е. без listen и accept)?

То есть примерно что-то следующее:

---один поток:
...
bind(socket1, ....)
select(....
recv(socket1, ...)
...

---другой поток
connect(socket2, ...) //коннектимся по заранее известному адресу
send(socket2, ...)
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042016
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вас интересуют средства передачи данных между потоками?
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042017
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похожее есть с UDP сокетом :-)
Есть такая штука "Присоединенный UDP сокет"

а зачем такое нужно если не секрет?
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042046
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--похожее есть с UDP сокетом :-)
Есть такая штука "Присоединенный UDP сокет"

Вроде, это только системная установка адресата по умолчанию для сокета, а не установка соединения.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042120
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, естественно. Ибо какое может быть соединение по UDP.
Но абстрактно он называется "присоединенным" - например, через него можно обмениваться датаграммами только с присоединенным оппонентом.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042159
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не между потоками.
Про потоки - это я для примера попроще...

Естественно, я про передачу данных между разными хостами.


Нужно - "для экономии на спичках".

Пишу что-то типа спайдера для мобильного устройства.
Ресурсов - кот наплакал, предел для стека потока - 64 кб.
А когда с десяток потоков крутится в памяти, то загрузка процессора 100%.

Вот и пытаюсь экономить где можно.
Жалко, профайлера нету никакого...
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042216
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ikНужно - "для экономии на спичках".

Мысля: а можно закрыть базовый сокет, после получения соединения?
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042304
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ikА когда с десяток потоков крутится в памяти, то загрузка процессора 100%.


Проверять список сокетов select-ом из ОДНОГО потока
accept можно ловить тем-же select-ом
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042338
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--да, естественно. Ибо какое может быть соединение по UDP.
Но абстрактно он называется "присоединенным" - например, через него можно обмениваться датаграммами только с присоединенным оппонентом.

Не обязательно. Это только для возможности пользования send()/write().
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042494
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) Makar4ikА когда с десяток потоков крутится в памяти, то загрузка процессора 100%.


Проверять список сокетов select-ом из ОДНОГО потока
accept можно ловить тем-же select-ом

Можно убить нескольких зайцев сразу.
Делать через обработку сигнала SIGIO, если пишется под Unix.

Не нужно лишний раз дергать select и количество нитей можно уменьшить.

Пока ждем SIGIO по одному сокету, нить обрабатывает следующий сокет.
В иделале можно уменьшить количество нитей до одной на 1 процессор.
При этом спящие нити не будут занимать стэк.
Если делать нечего можно заснуть, а приход сигнала SIGIO разбудит процесс.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042727
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhМысля: а можно закрыть базовый сокет, после получения соединения?Базовый, в смысле серверный? Который Listen?
Ну, в принципе можно, конечно, но через 150 мсек его опять создавать придется...

Gluk (Kazan)Проверять список сокетов select-ом из ОДНОГО потока
accept можно ловить тем-же select-омУ каждого потока порты, по которым сеть слушается - разные. :(
Да и толку от создания еще одного лишнего потока...
И так протолкнуться негде. :)

onstat-Делать через обработку сигнала SIGIO, если пишется под Unix.К сожалению, пишу под Win...

В общем, понятно, что под Win32 ловить нечего. :)
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042775
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ik

Gluk (Kazan)Проверять список сокетов select-ом из ОДНОГО потока
accept можно ловить тем-же select-омУ каждого потока порты, по которым сеть слушается - разные. :(
Да и толку от создания еще одного лишнего потока...
И так протолкнуться негде. :)


Select -у не важно какие порты, он смотрит на готовность файловых
дескрипторов на возможность проведения операции ВВ.
Если выпал Listen socket смотите на предмет нового соединения.
Если другой смотрите на проведение операции ВВ, или закрытия.

ИХМО
Select нужно крутить в одной нити для всех дескрипторов, а другим "говорить" что для них что то есть на обработку.

Makar4ik
onstat-Делать через обработку сигнала SIGIO, если пишется под Unix.К сожалению, пишу под Win...

В общем, понятно, что под Win32 ловить нечего. :)

Думаю в виндах, что то похожее тоже есть.
Нужно смотреть WINAPI глубже, но я в нем не спец.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34042936
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Select нужно крутить в одной нити для всех дескрипторов, а другим "говорить" что для них что то есть на обработку.

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

Дело не в том, что мне мешает блокировка при ожидании входящего соединения в потоке.
Она-таки как раз помогает.
Ибо на один поток - один приходящий сокет.
Просто я хотел обойтись всего одним сокетом в потоке,
но видно не судьба.

А лишняя нить для всех дескрипторов - это:
1. синхронизировать передачу в эту нить нового дескриптора.
(дополнительный объект синхронизации для "лишней" нити)
2. как-то остановить свою нить, дожидаясь сообщения от "лишней".
(дополнительный объект синхронизации (event) для каждой из рабочих нитей).
3. синхронизировать все последующие манипуляции с дескриптором.

результат:
все равно по 2 сокета на поток, по дополнительному HANDLE для каждого объекта Event на поток, и плюс еще один поток, который бог знает что делает.

И куча лишнего геморроя с синхронизацией, и ожиданием передачи управления между потоками.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043006
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ik onstat-Select нужно крутить в одной нити для всех дескрипторов, а другим "говорить" что для них что то есть на обработку.
Для такой схемы мне нужен будет лишний поток,Зачем??? Ты уверен что тебе на микро-ресурсах действительно нужна параллельная обработка приходящих данных? Можно ж вообще одним-единственным потоком обойтись.
select() ждет пока в любом из readfds что-нибудь появится и как появилось запускает для всех сокетов с данными процедуру приема и разбора пришедших данных. Потом возвращаемся в главный цикл и снова select().
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043046
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЗачем??? Ты уверен что тебе на микро-ресурсах действительно нужна параллельная обработка приходящих данных?
Не уверен.
Но пока проект сырой, и проще отлаживать каждый экземпляр в своем потоке.
А так - действительно, можно создавать один поток на 64 сокета...
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043060
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ikНо пока проект сырой, и проще отлаживать каждый экземпляр в своем потоке.Ну отлаживать то как раз проще когда только один поток :)
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043183
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ikДа и толку от создания еще одного лишнего потока...
И так протолкнуться негде. :)


Ты не понял, не ЕЩЕ ОДИН, а ЕДИНСТВЕННЫЙ поток, который обслуживает ВСЕ сокеты/порты (подставь нужное) которые необходимо. Подробности в MSDN
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043277
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ik White OwlЗачем??? Ты уверен что тебе на микро-ресурсах действительно нужна параллельная обработка приходящих данных?
Не уверен.
Но пока проект сырой, и проще отлаживать каждый экземпляр в своем потоке.
А так - действительно, можно создавать один поток на 64 сокета...

Можно создать класс с потоком и отдавать ему каллбаки приписанные к идентификатору сокета. Тогда и отлаживаться будет легко.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043392
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) Makar4ikДа и толку от создания еще одного лишнего потока...
И так протолкнуться негде. :)


Ты не понял, не ЕЩЕ ОДИН, а ЕДИНСТВЕННЫЙ поток, который обслуживает ВСЕ сокеты/порты (подставь нужное) которые необходимо. Подробности в MSDN

Тут есть один маленький момент.
Если нить(поток) обслуживает клиентские сокеты, то на connect,
он будет спать, пока другая сторона не приймет соединение.
Если эта задержка не напрягает то можно и в один.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043405
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Тут есть один маленький момент.
Если нить(поток) обслуживает клиентские сокеты, то на connect,
он будет спать, пока другая сторона не приймет соединение.
Если эта задержка не напрягает то можно и в один.

мы вроде об сервере ? какие нафих connect-ы ???
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043427
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Gluk (Kazan) Makar4ikДа и толку от создания еще одного лишнего потока...
И так протолкнуться негде. :)


Ты не понял, не ЕЩЕ ОДИН, а ЕДИНСТВЕННЫЙ поток, который обслуживает ВСЕ сокеты/порты (подставь нужное) которые необходимо. Подробности в MSDN

Тут есть один маленький момент.
Если нить(поток) обслуживает клиентские сокеты, то на connect,
он будет спать, пока другая сторона не приймет соединение.
Если эта задержка не напрягает то можно и в один.

Блокирующий сокет.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043500
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ik
onstat-Делать через обработку сигнала SIGIO, если пишется под Unix.К сожалению, пишу под Win...

В общем, понятно, что под Win32 ловить нечего. :)
В винде наверное можно использовать WSAAsyncSelect
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043549
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) onstat-Тут есть один маленький момент.
Если нить(поток) обслуживает клиентские сокеты, то на connect,
он будет спать, пока другая сторона не приймет соединение.
Если эта задержка не напрягает то можно и в один.

мы вроде об сервере ? какие нафих connect-ы ???

Ну мало ли,
мое дело предупредить о том, что это нужно учитывать.
Сервер может превратьться в клиента по любым причинам, в болшенстве случаев не зависящим от разработчика, и по опыту очень даже быстро.
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043728
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhБлокирующий сокет.

ичо, поймал уведомление в неблокирующем select-е и читай его блокирующими вызовами наздаровье
...
Рейтинг: 0 / 0
Еще раз про сокеты...
    #34043734
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Сервер может превратьться в клиента по любым причинам, в болшенстве случаев не зависящим от разработчика, и по опыту очень даже быстро.

гнать фшею такого разработчика. Можно на время connect-а сделать сокет неблокирующим, потом восстановить флажок и ждать соединения на select-е.
Этот случай также описан в популярной литературе :)
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Еще раз про сокеты...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]