|
|
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Народ! Кто-нибудь знает, есть ли в природе способ соединить два сокета без помощи третьего (т.е. без listen и accept)? То есть примерно что-то следующее: ---один поток: ... bind(socket1, ....) select(.... recv(socket1, ...) ... ---другой поток connect(socket2, ...) //коннектимся по заранее известному адресу send(socket2, ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 15:31 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Вас интересуют средства передачи данных между потоками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 15:42 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
похожее есть с UDP сокетом :-) Есть такая штука "Присоединенный UDP сокет" а зачем такое нужно если не секрет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 15:43 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
--null--похожее есть с UDP сокетом :-) Есть такая штука "Присоединенный UDP сокет" Вроде, это только системная установка адресата по умолчанию для сокета, а не установка соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 15:50 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
да, естественно. Ибо какое может быть соединение по UDP. Но абстрактно он называется "присоединенным" - например, через него можно обмениваться датаграммами только с присоединенным оппонентом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 16:10 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Нет, не между потоками. Про потоки - это я для примера попроще... Естественно, я про передачу данных между разными хостами. Нужно - "для экономии на спичках". Пишу что-то типа спайдера для мобильного устройства. Ресурсов - кот наплакал, предел для стека потока - 64 кб. А когда с десяток потоков крутится в памяти, то загрузка процессора 100%. Вот и пытаюсь экономить где можно. Жалко, профайлера нету никакого... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 16:19 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Makar4ikНужно - "для экономии на спичках". Мысля: а можно закрыть базовый сокет, после получения соединения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 16:32 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Makar4ikА когда с десяток потоков крутится в памяти, то загрузка процессора 100%. Проверять список сокетов select-ом из ОДНОГО потока accept можно ловить тем-же select-ом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 16:54 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
--null--да, естественно. Ибо какое может быть соединение по UDP. Но абстрактно он называется "присоединенным" - например, через него можно обмениваться датаграммами только с присоединенным оппонентом. Не обязательно. Это только для возможности пользования send()/write(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 17:00 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) Makar4ikА когда с десяток потоков крутится в памяти, то загрузка процессора 100%. Проверять список сокетов select-ом из ОДНОГО потока accept можно ловить тем-же select-ом Можно убить нескольких зайцев сразу. Делать через обработку сигнала SIGIO, если пишется под Unix. Не нужно лишний раз дергать select и количество нитей можно уменьшить. Пока ждем SIGIO по одному сокету, нить обрабатывает следующий сокет. В иделале можно уменьшить количество нитей до одной на 1 процессор. При этом спящие нити не будут занимать стэк. Если делать нечего можно заснуть, а приход сигнала SIGIO разбудит процесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 17:37 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
AkhМысля: а можно закрыть базовый сокет, после получения соединения?Базовый, в смысле серверный? Который Listen? Ну, в принципе можно, конечно, но через 150 мсек его опять создавать придется... Gluk (Kazan)Проверять список сокетов select-ом из ОДНОГО потока accept можно ловить тем-же select-омУ каждого потока порты, по которым сеть слушается - разные. :( Да и толку от создания еще одного лишнего потока... И так протолкнуться негде. :) onstat-Делать через обработку сигнала SIGIO, если пишется под Unix.К сожалению, пишу под Win... В общем, понятно, что под Win32 ловить нечего. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:51 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Makar4ik Gluk (Kazan)Проверять список сокетов select-ом из ОДНОГО потока accept можно ловить тем-же select-омУ каждого потока порты, по которым сеть слушается - разные. :( Да и толку от создания еще одного лишнего потока... И так протолкнуться негде. :) Select -у не важно какие порты, он смотрит на готовность файловых дескрипторов на возможность проведения операции ВВ. Если выпал Listen socket смотите на предмет нового соединения. Если другой смотрите на проведение операции ВВ, или закрытия. ИХМО Select нужно крутить в одной нити для всех дескрипторов, а другим "говорить" что для них что то есть на обработку. Makar4ik onstat-Делать через обработку сигнала SIGIO, если пишется под Unix.К сожалению, пишу под Win... В общем, понятно, что под Win32 ловить нечего. :) Думаю в виндах, что то похожее тоже есть. Нужно смотреть WINAPI глубже, но я в нем не спец. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 19:18 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
onstat-Select нужно крутить в одной нити для всех дескрипторов, а другим "говорить" что для них что то есть на обработку. Для такой схемы мне нужен будет лишний поток, и пачка аспирина, чтобы синхронизировать то, что без лишнего потока синхронизировать было не нужно... Дело не в том, что мне мешает блокировка при ожидании входящего соединения в потоке. Она-таки как раз помогает. Ибо на один поток - один приходящий сокет. Просто я хотел обойтись всего одним сокетом в потоке, но видно не судьба. А лишняя нить для всех дескрипторов - это: 1. синхронизировать передачу в эту нить нового дескриптора. (дополнительный объект синхронизации для "лишней" нити) 2. как-то остановить свою нить, дожидаясь сообщения от "лишней". (дополнительный объект синхронизации (event) для каждой из рабочих нитей). 3. синхронизировать все последующие манипуляции с дескриптором. результат: все равно по 2 сокета на поток, по дополнительному HANDLE для каждого объекта Event на поток, и плюс еще один поток, который бог знает что делает. И куча лишнего геморроя с синхронизацией, и ожиданием передачи управления между потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 21:54 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Makar4ik onstat-Select нужно крутить в одной нити для всех дескрипторов, а другим "говорить" что для них что то есть на обработку. Для такой схемы мне нужен будет лишний поток,Зачем??? Ты уверен что тебе на микро-ресурсах действительно нужна параллельная обработка приходящих данных? Можно ж вообще одним-единственным потоком обойтись. select() ждет пока в любом из readfds что-нибудь появится и как появилось запускает для всех сокетов с данными процедуру приема и разбора пришедших данных. Потом возвращаемся в главный цикл и снова select(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 23:25 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
White OwlЗачем??? Ты уверен что тебе на микро-ресурсах действительно нужна параллельная обработка приходящих данных? Не уверен. Но пока проект сырой, и проще отлаживать каждый экземпляр в своем потоке. А так - действительно, можно создавать один поток на 64 сокета... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 00:23 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Makar4ikНо пока проект сырой, и проще отлаживать каждый экземпляр в своем потоке.Ну отлаживать то как раз проще когда только один поток :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 00:53 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Makar4ikДа и толку от создания еще одного лишнего потока... И так протолкнуться негде. :) Ты не понял, не ЕЩЕ ОДИН, а ЕДИНСТВЕННЫЙ поток, который обслуживает ВСЕ сокеты/порты (подставь нужное) которые необходимо. Подробности в MSDN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 08:25 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Makar4ik White OwlЗачем??? Ты уверен что тебе на микро-ресурсах действительно нужна параллельная обработка приходящих данных? Не уверен. Но пока проект сырой, и проще отлаживать каждый экземпляр в своем потоке. А так - действительно, можно создавать один поток на 64 сокета... Можно создать класс с потоком и отдавать ему каллбаки приписанные к идентификатору сокета. Тогда и отлаживаться будет легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 09:45 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) Makar4ikДа и толку от создания еще одного лишнего потока... И так протолкнуться негде. :) Ты не понял, не ЕЩЕ ОДИН, а ЕДИНСТВЕННЫЙ поток, который обслуживает ВСЕ сокеты/порты (подставь нужное) которые необходимо. Подробности в MSDN Тут есть один маленький момент. Если нить(поток) обслуживает клиентские сокеты, то на connect, он будет спать, пока другая сторона не приймет соединение. Если эта задержка не напрягает то можно и в один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 10:18 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
onstat-Тут есть один маленький момент. Если нить(поток) обслуживает клиентские сокеты, то на connect, он будет спать, пока другая сторона не приймет соединение. Если эта задержка не напрягает то можно и в один. мы вроде об сервере ? какие нафих connect-ы ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 10:20 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
onstat- Gluk (Kazan) Makar4ikДа и толку от создания еще одного лишнего потока... И так протолкнуться негде. :) Ты не понял, не ЕЩЕ ОДИН, а ЕДИНСТВЕННЫЙ поток, который обслуживает ВСЕ сокеты/порты (подставь нужное) которые необходимо. Подробности в MSDN Тут есть один маленький момент. Если нить(поток) обслуживает клиентские сокеты, то на connect, он будет спать, пока другая сторона не приймет соединение. Если эта задержка не напрягает то можно и в один. Блокирующий сокет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 10:25 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Makar4ik onstat-Делать через обработку сигнала SIGIO, если пишется под Unix.К сожалению, пишу под Win... В общем, понятно, что под Win32 ловить нечего. :) В винде наверное можно использовать WSAAsyncSelect ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 10:42 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) onstat-Тут есть один маленький момент. Если нить(поток) обслуживает клиентские сокеты, то на connect, он будет спать, пока другая сторона не приймет соединение. Если эта задержка не напрягает то можно и в один. мы вроде об сервере ? какие нафих connect-ы ??? Ну мало ли, мое дело предупредить о том, что это нужно учитывать. Сервер может превратьться в клиента по любым причинам, в болшенстве случаев не зависящим от разработчика, и по опыту очень даже быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 10:57 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
AkhБлокирующий сокет. ичо, поймал уведомление в неблокирующем select-е и читай его блокирующими вызовами наздаровье ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 11:34 |
|
||
|
Еще раз про сокеты...
|
|||
|---|---|---|---|
|
#18+
onstat-Сервер может превратьться в клиента по любым причинам, в болшенстве случаев не зависящим от разработчика, и по опыту очень даже быстро. гнать фшею такого разработчика. Можно на время connect-а сделать сокет неблокирующим, потом восстановить флажок и ждать соединения на select-е. Этот случай также описан в популярной литературе :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 11:37 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34043392&tid=2030323]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
138ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 479ms |

| 0 / 0 |
