Несколько QTcpServer на одном порте |
Здравствуйте, гость ( Вход | Регистрация )
Несколько QTcpServer на одном порте |
borune |
15.10.2013, 12:54
Сообщение
#1
|
Участник Группа: Участник Сообщений: 152 Регистрация: 1.1.2011 Пользователь №: 2314 Спасибо сказали: 0 раз(а) Репутация: 0 |
Ребят, такой вопрос.
Вот есть, например, некая многопоточная сетевая программа, выполняющаяся на всех сетевых машинах. Каждый поток отвечает за сетевое взаимодействие с одним определенным узлом (т.е. число потоков равно числу узлов в сети - 1). В каждом потоке требуется организовать сокет для обмена данными между двумя машинами. Вопрос в том, как это реализовать. У меня есть такая идея. Сделать в потоке сервер, который будет слушать нужный порт. Когда кто-то в этот порт стучится, обработчик сигнала QTcpServer::newConnection() создает сокет и анализирует его peerAddress. Если он совпадает с адресом той машины, за обмен с которой отвечает данный поток, то по созданному сокету начинается передача данных. В ином случае сокет должен быть передан "дальше", т.е. он должен будет попасть в другой поток, из него в следующий, и так далее, до тех пор, пока не дойдет до нужного потока. Ввот как передать созданный сокет в другой поток? Если кто не очень понял о чем речь, то тот же вопрос можно перефразировать так: если имеются несколько объектов QTcpServer, которые слушают один и тот же порт, то все ли эти объекты будут имитировать сигнал newConnection() при подключении кого-то в этому порту, и смогу ли я при помощи метода QTcpServer::nextPendingConnection() получить доступ к сокету и работать с ним в каждом из потоков? Сообщение отредактировал borune - 15.10.2013, 13:01 |
|
|
Алексей1153 |
15.10.2013, 13:02
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
два сокета не могут слушать один и тот же порт. Тут нужен один слушающий сокет - он примет две точки соединения, а твоя программа свяжет их трафик между собой по нужному тебе алгоритму
Сообщение отредактировал Алексей1153 - 15.10.2013, 13:02 |
|
|
borune |
15.10.2013, 13:10
Сообщение
#3
|
Участник Группа: Участник Сообщений: 152 Регистрация: 1.1.2011 Пользователь №: 2314 Спасибо сказали: 0 раз(а) Репутация: 0 |
два сокета не могут слушать один и тот же порт. Тут нужен один слушающий сокет - он примет две точки соединения, а твоя программа свяжет их трафик между собой по нужному тебе алгоритму Ну то есть всегда только один из объектов будет выдавать сигнал о новом подключении? Я просто думал, может там, например, сигнализировать будут все, но указывать при этом будут на один и тот же объект, т.е. метод nextPendingConnection() будет возвращать указатель на один и тот же сокет во все потоки. Не? |
|
|
Алексей1153 |
15.10.2013, 13:35
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
borune, ты ощущаешь разницу между слушающим сокетом и клиентским сокетом ? http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%...B5%D0%B9%D1%81)
слушающий сокет (сервер) создаётся системой и прикрепляется к порту (создать второй сокет на этом порту уже нельзя) соответственно, второй сервер на таком же порту, как и первый сервер, не создастся и сигналов (в рамках Qt) о подключении клиента, само собой, слать не сможет Сообщение отредактировал Алексей1153 - 15.10.2013, 13:35 |
|
|
borune |
15.10.2013, 14:32
Сообщение
#5
|
Участник Группа: Участник Сообщений: 152 Регистрация: 1.1.2011 Пользователь №: 2314 Спасибо сказали: 0 раз(а) Репутация: 0 |
borune, ты ощущаешь разницу между слушающим сокетом и клиентским сокетом ? http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%...B5%D0%B9%D1%81) слушающий сокет (сервер) создаётся системой и прикрепляется к порту (создать второй сокет на этом порту уже нельзя) соответственно, второй сервер на таком же порту, как и первый сервер, не создастся и сигналов (в рамках Qt) о подключении клиента, само собой, слать не сможет Я не знаю что такое слушающий сокет, я создаю сервер, который слушает порт. Если к серверу кто-то подключается - то в этом случае создается сокет при помощи метода QTcpServer::nextPendingConnection(). |
|
|
Алексей1153 |
15.10.2013, 14:51
Сообщение
#6
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
сервер - это и есть слушающий сокет
а nextPendingConnection() берёт из очереди запросов очередной необработанный запрос на подключение и присоединяет к нему клиентский сокет. Получается соединение клиент-----клиент, один клиент находится у тебя на машине, другой (в общем случае) - где угодно в сети. Вот эти два клиента и обмениваются данными, а сервер в обмене никак не участвует Сообщение отредактировал Алексей1153 - 15.10.2013, 14:52 |
|
|
borune |
15.10.2013, 15:32
Сообщение
#7
|
Участник Группа: Участник Сообщений: 152 Регистрация: 1.1.2011 Пользователь №: 2314 Спасибо сказали: 0 раз(а) Репутация: 0 |
сервер - это и есть слушающий сокет а nextPendingConnection() берёт из очереди запросов очередной необработанный запрос на подключение и присоединяет к нему клиентский сокет. Получается соединение клиент-----клиент, один клиент находится у тебя на машине, другой (в общем случае) - где угодно в сети. Вот эти два клиента и обмениваются данными, а сервер в обмене никак не участвует ага, я понял, спасибо) |
|
|
Текстовая версия | Сейчас: 29.3.2024, 1:01 |