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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа через 2 сетевых интерфейса(2 сетевые карты).  (Прочитано 5884 раз)
Racot
Гость
« : Сентябрь 04, 2012, 21:01 »

У меня есть компьютер с двумя сетевыми картами - мне нужно через них общаться с 2 разными устройствами из одного приложения по TCP. Как мне выбирать сетевой интерфейс?

И допустим я просто создаю сокет - как он определяет какой интерфейс использовать?

Есть конечно класс QNetworkInterface - но из него я могу только посмотреть наличие сетевых устройств,ip адреса,МАКи и т.д. но мне это вроде ничего не дает(((
Записан
Fat-Zer
Гость
« Ответ #1 : Сентябрь 04, 2012, 21:34 »

если серверная часть, то можно задать, какой интерфейс слушать, а можно слушать всё подряд(0.0.0.0)...
если клиентская часть, то надо только задать к кому подключаться, а дальше маршрутизацией заведует ОС...

ЗЫ: в любом случае если TCP, то всё это на уровне ip адресов и портов, а не интерфейсов...
ЗЗЫ: FIXME
« Последнее редактирование: Сентябрь 04, 2012, 21:36 от Fat-Zer » Записан
Serr500
Гость
« Ответ #2 : Сентябрь 04, 2012, 21:36 »

У меня есть компьютер с двумя сетевыми картами - мне нужно через них общаться с 2 разными устройствами из одного приложения по TCP. Как мне выбирать сетевой интерфейс?
Для QTcpServer есть метод listen, для QTcpSocket никак. Qt такой возможности не предоставляет.

И допустим я просто создаю сокет - как он определяет какой интерфейс использовать?
Это определяет не сокет, а операционная система, основываясь на таблице маршрутизации.

Есть конечно класс QNetworkInterface - но из него я могу только посмотреть наличие сетевых устройств,ip адреса,МАКи и т.д. но мне это вроде ничего не дает(((
Не даёт.

Главный вопрос: Действительно ли вашему приложению нужно самому выбирать сетевую карту или вполне можно обойтись выбором ОС? Очень часто это не нужно.

Если это действительно нужно, то смотрим в сторону QAbstractSocket::socketDescriptor и Winsock bind (http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550%28v=vs.85%29.aspx)
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Сентябрь 04, 2012, 22:25 »

ТС, а искать по форуму не учили?

Вот одно из направлений решения:

http://www.prog.org.ru/topic_20207_0.html

Но я бы поступил иначе:

Создал свой класс MyCoolSocket, отнаследовавшить бы к примеру от QAbstractSocket, и в нем бы реализовал метод:

Код
C++ (Qt)
MyCoolSocket::CreateSocket()
{
   // тут тупо взял бы и переписал метод createNewSocket() скопипастив его
   // (см исходники QAbstractSocket )
   int descriptor = createNewSocket(бла бла бла);
 
   // потом сделал бы
   setSocketDescriptor(descriptor);
}

потом сделал бы метод bind(...)
Код
C++ (Qt)
MyCoolSocket::bind(бла бла)
{
   int descriptor = socketDescriptor();
 
   // потом написал платформо-зависимый код для bind
   // или опять же тупо скопипастил реализацию nativeBind(), немного подправив
   ::bind(descriptor, блабла address);
}

И использовал бы в коде так:
Код
C++ (Qt)
{
   MyCoolSocket socket;
 
   socket.CreateSocket(socketOptions);
   socket.bind(desiredNetworkIfaceAddress,  bindOptions);
 
   socket.connectToHost(remoteAddress, port);
 
   ...
}
 

Как-то так в двух словах.


« Последнее редактирование: Сентябрь 04, 2012, 22:33 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Racot
Гость
« Ответ #4 : Сентябрь 05, 2012, 17:06 »

Спасибо за ответы! похоже тут три варианта:
1) распихать карточки в разные подсети.
2) создать родной сокет->сделать bind() -> передать дескриптор кутишному сокету.
3) ждать стабильной версии Qt5 где bind() есть для TCP.

Я думаю вопрос снят)
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #5 : Сентябрь 18, 2012, 10:19 »

А вот такой вопрос 1-карта -> 1 -устройство ?
Записан
Serr500
Гость
« Ответ #6 : Сентябрь 18, 2012, 10:32 »

Нет. Бывают "многоголовые" сетевые карты, т.е. одно устройство содержит несколько сетевых карт.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #7 : Сентябрь 18, 2012, 10:40 »

 :)а понятно.
Но bind же появится только в 5.0, а через setSocketDescriptor можно решить проблему?
Записан
Serr500
Гость
« Ответ #8 : Сентябрь 18, 2012, 11:06 »

Сам не пробовал, но думаю, что да.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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