Russian Qt Forum
Ноябрь 23, 2024, 15:00
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Работа с сетью
>
Как привязать QTcpSocket к конкретной сетевой плате?
Страниц:
1
[
2
]
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как привязать QTcpSocket к конкретной сетевой плате? (Прочитано 19917 раз)
andrew.k
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #15 :
Июль 11, 2012, 11:28 »
Цитата: Akon от Июль 11, 2012, 10:42
Ответ на изначальный вопрос во втором посте. Еще вариант - создать нативный сокет, прибиндить его на желаемый сетевой интерфейс и сделать setSocketDescriptor().
Note that this function does not bind the local address of the socket prior to a connection (e.g., QUdpSocket::bind()).
Записан
DmitryM
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #16 :
Июль 11, 2012, 11:33 »
Цитата: Akon от Июль 11, 2012, 10:42
Ответ на изначальный вопрос во втором посте. Еще вариант - создать нативный сокет, прибиндить его на желаемый сетевой интерфейс и сделать setSocketDescriptor().
И как ты будешь биндить к инерфейсу? См.
bind
Записан
Serr500
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #17 :
Июль 11, 2012, 12:02 »
Биндить нужно к адресу. Адрес привязан к интерфейсу. Следовательно, сокет будет привязан к интерфейсу.
Записан
Akon
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #18 :
Июль 11, 2012, 12:52 »
Цитата: Serr500 от Июль 11, 2012, 11:04
Во втором посте ответ неверный.
Цитировать
void QAbstractSocket::setLocalAddress ( const QHostAddress & address ) [protected]
You can call this function in a subclass of QAbstractSocket to change the return value of the localAddress() function after a connection has been established. This feature is commonly used by proxy connections for virtual connection settings.
Цитировать
Цитата: Akon от Сегодня в 10:42
Ответ на изначальный вопрос во втором посте. Еще вариант - создать нативный сокет, прибиндить его на желаемый сетевой интерфейс и сделать setSocketDescriptor().
Note that this function does not bind the local address of the socket prior to a connection (e.g., QUdpSocket::bind()).
Из этого я могу сделать твердый вывод лишь о том, что localAddress() будет возвращать реальное значение только после того, как произойдет коннект, поскольку до коннекта системный сокет не создается. Впрочем, я очень допускаю, что установленное значение localAddress не используется в bind'e, и то, что setLocalAddress() не паблик - тому аргумент. Для выяснения этого нужно смотреть, что подается в системный bind.
Тем не менее, всегда есть вариант "создать нативный сокет, прибиндить его на желаемый сетевой интерфейс и сделать setSocketDescriptor()." В частности, я так биндил мультикастовые сокеты.
Записан
DmitryM
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #19 :
Июль 11, 2012, 13:20 »
Цитата: Akon от Июль 11, 2012, 12:52
В частности, я так биндил мультикастовые сокеты.
QHostAddress::Any?
Записан
andrew.k
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #20 :
Июль 11, 2012, 13:41 »
Цитата: Serr500 от Июль 11, 2012, 12:02
Биндить нужно к адресу. Адрес привязан к интерфейсу. Следовательно, сокет будет привязан к интерфейсу.
Ты напиши конкретный код на qt и сюда запости, тогда может перестанешь глупости писать.
Записан
Akon
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #21 :
Июль 11, 2012, 13:44 »
QHostAddress::Any?
Это значит на усмотрение системы - что будет мултикаст?
Цитировать
Ты напиши конкретный код на qt и сюда запости, тогда может перестанешь глупости писать.
На сетевом интерфейсе несколько сетевых адресов, в бинд подается один из их числа, после успешной привязки будет работа через данный интерфейс. В чем глупость?
«
Последнее редактирование: Июль 11, 2012, 13:48 от Akon
»
Записан
andrew.k
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #22 :
Июль 11, 2012, 13:53 »
Цитата: Akon от Июль 11, 2012, 13:44
QHostAddress::Any?
Это значит на усмотрение системы - что будет мултикаст?
Цитировать
Ты напиши конкретный код на qt и сюда запости, тогда может перестанешь глупости писать.
На сетевом интерфейсе несколько сетевых адресов, в бинд подается один из их числа, после успешной привязки будет работа через данный интерфейс. В чем глупость?
Запутался, кто что пишет. Я подумал, что сер00 пытается убедить, что setLocalAddress является решением.
Перечитал. Вроде уже во всем разобрались.
Средствами qt это сделать нельзя. Только ручками через bind.
А тред все еще продолжается
Кстати извиняюсь, за "глупость".
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #23 :
Июль 25, 2012, 15:33 »
А как получить список установленных сетевых карт и их настроек.
Задача такова: на каждом клиенте есть две линии связи (две сетевых карты).
2 сокета должны подключаться через первую карту, 2 через вторую. Итого 4 сокета на 2 сетевые = 4 канала.
Подключение идет к 4м разным серверам (которые друг друга дублируют + кое какие ньюансы, но не берем в расчет).
Есть программа редактор. В ней создается проект и задаются его настройки (сетевые в частности).
В этих настройках задаю ip:port для каждого клиента.
Теперь нужно еще указывать индекс сетевой карты (от нуля до макс, но пока до 1, т.е. 2 сетевых). Так как в редакторе не известно какие сетевые адреса будут иметь карты на конечных машинах (да и не важно). Если сетевая карта одна, то все подключения будут идти через нее.
Т.е. мне нужно узнать сколько сетевых на конченой машине установлено, выудить их адреса и затем уже биндить сокет получается?
Записан
andrew.k
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #24 :
Июль 25, 2012, 16:24 »
Цитата: Fregloin от Июль 25, 2012, 15:33
Теперь нужно еще указывать индекс сетевой карты (от нуля до макс, но пока до 1, т.е. 2 сетевых). Так как в редакторе не известно какие сетевые адреса будут иметь карты на конечных машинах (да и не важно). Если сетевая карта одна, то все подключения будут идти через нее.
Т.е. мне нужно узнать сколько сетевых на конченой машине установлено, выудить их адреса и затем уже биндить сокет получается
Я бы лучше для идентификации карт использовал не индекс и не IP, а mac-адрес.
Это все-таки более однозначно и не зависит от прочих обстоятельств,
чем ничего не значащее "сетевая карта 1" и "сетевая карта 2". Сразу вопросы будут возникать.
Цитата: Fregloin от Июль 25, 2012, 15:33
Т.е. мне нужно узнать сколько сетевых на конченой машине установлено, выудить их адреса и затем уже биндить сокет получается
Ну да. Вроде ж обсудили уже все.
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #25 :
Июль 25, 2012, 17:27 »
ну макадрес... во первых я его могу не знать заранее, во вторых одинаковые конфигурации клиентов могут работать на нескольких разных машинах, а это получается нужно для каждой машины иметь отличные конфигурации что не есть хорошо
Записан
andrew.k
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #26 :
Июль 25, 2012, 17:57 »
Цитата: Fregloin от Июль 25, 2012, 17:27
ну макадрес... во первых я его могу не знать заранее, во вторых одинаковые конфигурации клиентов могут работать на нескольких разных машинах, а это получается нужно для каждой машины иметь отличные конфигурации что не есть хорошо
А если я сетевухи поменяю местами или винда их поменяет местами, то конфигурация работать уже не будет.
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #27 :
Июль 30, 2012, 12:51 »
я написал, что привязываться к мак-адресам не могу. да не особо принципиально.
Записан
Странник
Гость
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #28 :
Август 07, 2012, 10:21 »
к слову, в Qt 5 будет возможно использовать bind до connect:
Цитировать
Binding of TCP sockets
QTcpSocket can be bound to an IP address before connecting, which can be used to limit the connection to a specific interface in a multihomed environment.
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Как привязать QTcpSocket к конкретной сетевой плате?
«
Ответ #29 :
Январь 30, 2013, 15:35 »
SOCKET s = АПИ, создающая сокет
bind(s, желаемый сетевой интерфейс);
QTcpSocket qs;
ds.setSocketDescriptor(s);
ds.connectToHost(...);
взял с параллельной темы пример. setSocketDescriptor возвращает true, а реальный коннект с заданной сетевой не происходит - коннект идет с первой доступной сетеовой. если выдернуть кабель с первой карты, то конект идет со второй (с которой и надо). с чем это связанно я так и не понял
Записан
Страниц:
1
[
2
]
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...