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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Как привязать QTcpSocket к конкретной сетевой плате?  (Прочитано 19760 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Июль 10, 2012, 12:02 »

Задача: есть 2 сетевых карты на компе, есть 4 клиентских сокета.
Нужно привязать 2 сокета на одну карту и 2 других сокета на другую картру.
Как это сделать?
+ Проверка, если нет 2 карт, соединяться через доступную.
+ абстрагирование от конкретного сетевого интерфейса (eth0,eth1 и в винде хз какие) так как по может работать и под вин и под лин.

Ну на счёт абстракции просто использовать индексы карт 0,1,2...
А вот как привязать сокет к конкретной сетевой карте?
Записан
mutineer
Гость
« Ответ #1 : Июль 10, 2012, 12:09 »

может унаследоваться от сокета и использовать
Код:
void QAbstractSocket::setLocalAddress ( const QHostAddress & address ) [protected]
?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


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

хм, а что это даст? суть в том, что по двум сетевухам подключены 2 разных физических сети (для надёжности передачи данных),и если одна из них загибается, то данные будут идти со второй.
А так, неизвестно какой сокет к какой сетевухе ОС привяжет.
Записан
DmitryM
Гость
« Ответ #3 : Июль 10, 2012, 14:13 »

хм, а что это даст? суть в том, что по двум сетевухам подключены 2 разных физических сети (для надёжности передачи данных),и если одна из них загибается, то данные будут идти со второй.
А так, неизвестно какой сокет к какой сетевухе ОС привяжет.
Посмотри на вывод ifconfig и подумай  Смеющийся
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Июль 10, 2012, 18:56 »

посмотрел, и что? я не улавливаю ход ваших мыслей (
Записан
Serr500
Гость
« Ответ #5 : Июль 10, 2012, 20:38 »

хм, а что это даст? суть в том, что по двум сетевухам подключены 2 разных физических сети (для надёжности передачи данных),и если одна из них загибается, то данные будут идти со второй.
А так, неизвестно какой сокет к какой сетевухе ОС привяжет.
Обычно у каждой сетевой карты свой IP-адрес. Привязка сокета к адресу автоматически привязывает его к определённому физическому устройству. Если же карты объединены в кластер и имеют единственный IP-адрес, то высокоуровневые функции, которые используются в Qt не позволят выбирать конкретную карту в любом случае.
Записан
andrew.k
Гость
« Ответ #6 : Июль 10, 2012, 20:49 »

хм, а что это даст? суть в том, что по двум сетевухам подключены 2 разных физических сети (для надёжности передачи данных),и если одна из них загибается, то данные будут идти со второй.
А так, неизвестно какой сокет к какой сетевухе ОС привяжет.
Обычно у каждой сетевой карты свой IP-адрес. Привязка сокета к адресу автоматически привязывает его к определённому физическому устройству. Если же карты объединены в кластер и имеют единственный IP-адрес, то высокоуровневые функции, которые используются в Qt не позволят выбирать конкретную карту в любом случае.
Тут речь об исходящем соединении (QTcpSocket), а ты говоришь о бинде сервера на определенный интерфейс.

Fregloin, ответ на поставленный вопрос: никак.
За выбор того или иного пути отвечает протокол, поэтому прикладной уровень не может на это влиять.
Поэтому твою задачу должен решать администратор сети. А твое ПО лишь должно диагностировать обрыв канала.
Записан
Serr500
Гость
« Ответ #7 : Июль 10, 2012, 21:08 »

Тут речь об исходящем соединении (QTcpSocket), а ты говоришь о бинде сервера на определенный интерфейс.
Упс... Что-то я невнимателен сегодня. Устал. Извиняюсь. Почему-то решил, что там listen, а не connect.
Записан
Serr500
Гость
« Ответ #8 : Июль 10, 2012, 21:21 »

Хм...  В замешательстве А вот что сказано в MSDN:
Цитировать
The bind function may also be used on an unconnected socket before subsequent calls to the connect, ConnectEx, WSAConnect, WSAConnectByList, or WSAConnectByName functions before send operations.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550%28v=vs.85%29.aspx
Так что bind перед connect, кажется, привяжет сокет к локальному адресу.
Записан
DmitryM
Гость
« Ответ #9 : Июль 10, 2012, 23:12 »

Fregloin, ответ на поставленный вопрос: никак.
Каждому сетевому интерфейсу соответствует свой ip адрес. Сокет привязывается к адресу и порту, поэтому
Код
C++ (Qt)
void QAbstractSocket::connectToHost ( const QHostAddress & address, quint16 port, OpenMode openMode = ReadWrite )
 


За выбор того или иного пути отвечает протокол, поэтому прикладной уровень не может на это влиять.
Пример сервер имеет eth0 с ip 192.168.0.1 eth1 с ip 192.168.0.64
Пингую 192.168.0.1, пинг прошел, посылаю запрос 192.168.0.1.
если пинг на 192.168.0.1 не прошел, то посылаю запрос на 192.168.0.64.
В чем проблема?
Записан
andrew.k
Гость
« Ответ #10 : Июль 10, 2012, 23:43 »

Fregloin, ответ на поставленный вопрос: никак.
Каждому сетевому интерфейсу соответствует свой ip адрес. Сокет привязывается к адресу и порту, поэтому
Код
C++ (Qt)
void QAbstractSocket::connectToHost ( const QHostAddress & address, quint16 port, OpenMode openMode = ReadWrite )
 


За выбор того или иного пути отвечает протокол, поэтому прикладной уровень не может на это влиять.
Пример сервер имеет eth0 с ip 192.168.0.1 eth1 с ip 192.168.0.64
Пингую 192.168.0.1, пинг прошел, посылаю запрос 192.168.0.1.
если пинг на 192.168.0.1 не прошел, то посылаю запрос на 192.168.0.64.
В чем проблема?
В том, что ты не понимаешь суть дела.
Записан
andrew.k
Гость
« Ответ #11 : Июль 10, 2012, 23:56 »

Хм...  В замешательстве А вот что сказано в MSDN:
Цитировать
The bind function may also be used on an unconnected socket before subsequent calls to the connect, ConnectEx, WSAConnect, WSAConnectByList, or WSAConnectByName functions before send operations.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550%28v=vs.85%29.aspx
Так что bind перед connect, кажется, привяжет сокет к локальному адресу.
Да, видимо это все таки возможно, если делать ручками (android же как-то умеет использовать тот или другой интефейс), но средствами qt пока нет.
Записан
DmitryM
Гость
« Ответ #12 : Июль 11, 2012, 09:56 »

Да, видимо это все таки возможно, если делать ручками (android же как-то умеет использовать тот или другой интефейс), но средствами qt пока нет.
Привязка осуществляется к ip адресу, переключение идет на уровне TCP/IP при наличие более одного маршрута.

Записан
Akon
Гость
« Ответ #13 : Июль 11, 2012, 10:42 »

Ответ на изначальный вопрос во втором посте. Еще вариант - создать нативный сокет, прибиндить его на желаемый сетевой интерфейс и сделать setSocketDescriptor().
Записан
Serr500
Гость
« Ответ #14 : Июль 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.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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