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

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

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

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

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

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

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

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


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

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

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

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


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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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


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

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

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


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

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

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

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

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

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

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

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


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