Russian Qt Forum
Ноябрь 23, 2024, 15:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Как привязать QTcpSocket к конкретной сетевой плате?  (Прочитано 19938 раз)
andrew.k
Гость
« Ответ #15 : Июль 11, 2012, 11:28 »

Ответ на изначальный вопрос во втором посте. Еще вариант - создать нативный сокет, прибиндить его на желаемый сетевой интерфейс и сделать setSocketDescriptor().
Note that this function does not bind the local address of the socket prior to a connection (e.g., QUdpSocket::bind()).
Записан
DmitryM
Гость
« Ответ #16 : Июль 11, 2012, 11:33 »

Ответ на изначальный вопрос во втором посте. Еще вариант - создать нативный сокет, прибиндить его на желаемый сетевой интерфейс и сделать setSocketDescriptor().
И как ты будешь биндить к инерфейсу? См. bind
Записан
Serr500
Гость
« Ответ #17 : Июль 11, 2012, 12:02 »

Биндить нужно к адресу. Адрес привязан к интерфейсу. Следовательно, сокет будет привязан к интерфейсу.
Записан
Akon
Гость
« Ответ #18 : Июль 11, 2012, 12:52 »

Во втором посте ответ неверный.
Цитировать
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
Гость
« Ответ #19 : Июль 11, 2012, 13:20 »

В частности, я так биндил мультикастовые сокеты.
QHostAddress::Any?
Записан
andrew.k
Гость
« Ответ #20 : Июль 11, 2012, 13:41 »

Биндить нужно к адресу. Адрес привязан к интерфейсу. Следовательно, сокет будет привязан к интерфейсу.
Ты напиши конкретный код на qt и сюда запости, тогда может перестанешь глупости писать.
Записан
Akon
Гость
« Ответ #21 : Июль 11, 2012, 13:44 »

QHostAddress::Any?
Это значит на усмотрение системы - что будет мултикаст?

Цитировать
Ты напиши конкретный код на qt и сюда запости, тогда может перестанешь глупости писать.
На сетевом интерфейсе несколько сетевых адресов, в бинд подается один из их числа, после успешной привязки будет работа через данный интерфейс. В чем глупость?

« Последнее редактирование: Июль 11, 2012, 13:48 от Akon » Записан
andrew.k
Гость
« Ответ #22 : Июль 11, 2012, 13:53 »

QHostAddress::Any?
Это значит на усмотрение системы - что будет мултикаст?

Цитировать
Ты напиши конкретный код на qt и сюда запости, тогда может перестанешь глупости писать.
На сетевом интерфейсе несколько сетевых адресов, в бинд подается один из их числа, после успешной привязки будет работа через данный интерфейс. В чем глупость?
Запутался, кто что пишет. Я подумал, что сер00 пытается убедить, что setLocalAddress является решением.
Перечитал. Вроде уже во всем разобрались.
Средствами qt это сделать нельзя. Только ручками через bind.
А тред все еще продолжается  Непонимающий

Кстати извиняюсь, за "глупость".
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #23 : Июль 25, 2012, 15:33 »

А как получить список установленных сетевых карт и их настроек.

Задача такова: на каждом клиенте есть две линии связи (две сетевых карты).
2 сокета должны подключаться через первую карту, 2 через вторую. Итого 4 сокета на 2 сетевые = 4 канала.
Подключение идет к 4м разным серверам (которые друг друга дублируют + кое какие ньюансы, но не берем в расчет).

Есть программа редактор. В ней создается проект и задаются его настройки (сетевые в частности).
В этих настройках задаю ip:port для каждого клиента.
Теперь нужно еще указывать индекс сетевой карты (от нуля до макс, но пока до 1, т.е. 2 сетевых). Так как в редакторе не известно какие сетевые адреса будут иметь карты на конечных машинах (да и не важно). Если сетевая карта одна, то все подключения будут идти через нее.
Т.е. мне нужно узнать сколько сетевых на конченой машине установлено, выудить их адреса и затем уже биндить сокет получается?

Записан
andrew.k
Гость
« Ответ #24 : Июль 25, 2012, 16:24 »

Теперь нужно еще указывать индекс сетевой карты (от нуля до макс, но пока до 1, т.е. 2 сетевых). Так как в редакторе не известно какие сетевые адреса будут иметь карты на конечных машинах (да и не важно). Если сетевая карта одна, то все подключения будут идти через нее.
Т.е. мне нужно узнать сколько сетевых на конченой машине установлено, выудить их адреса и затем уже биндить сокет получается
Я бы лучше для идентификации карт использовал не индекс и не IP, а mac-адрес.
Это все-таки более однозначно и не зависит от прочих обстоятельств,
чем ничего не значащее "сетевая карта 1" и "сетевая карта 2". Сразу вопросы будут возникать.

Т.е. мне нужно узнать сколько сетевых на конченой машине установлено, выудить их адреса и затем уже биндить сокет получается
Ну да. Вроде ж обсудили уже все.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #25 : Июль 25, 2012, 17:27 »

ну макадрес... во первых я его могу не знать заранее, во вторых одинаковые конфигурации клиентов могут работать на нескольких разных машинах, а это получается нужно для каждой машины иметь отличные конфигурации что не есть хорошо
Записан
andrew.k
Гость
« Ответ #26 : Июль 25, 2012, 17:57 »

ну макадрес... во первых я его могу не знать заранее, во вторых одинаковые конфигурации клиентов могут работать на нескольких разных машинах, а это получается нужно для каждой машины иметь отличные конфигурации что не есть хорошо
А если я сетевухи поменяю местами или винда их поменяет местами, то конфигурация работать уже не будет.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #27 : Июль 30, 2012, 12:51 »

я написал, что привязываться к мак-адресам не могу. да не особо принципиально.
Записан
Странник
Гость
« Ответ #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 Offline

Сообщений: 1025


Просмотр профиля
« Ответ #29 : Январь 30, 2013, 15:35 »

SOCKET s = АПИ, создающая сокет
bind(s, желаемый сетевой интерфейс);
QTcpSocket qs;
ds.setSocketDescriptor(s);
ds.connectToHost(...);

взял с параллельной темы пример. setSocketDescriptor возвращает true, а реальный коннект с заданной сетевой не происходит - коннект идет с первой доступной сетеовой. если выдернуть кабель с первой карты, то конект идет со второй (с которой и надо). с чем это связанно я так и не понял
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.311 секунд. Запросов: 23.