Russian Qt Forum

Qt => Работа с сетью => Тема начата: Racot от Сентябрь 04, 2012, 21:01



Название: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: Racot от Сентябрь 04, 2012, 21:01
У меня есть компьютер с двумя сетевыми картами - мне нужно через них общаться с 2 разными устройствами из одного приложения по TCP. Как мне выбирать сетевой интерфейс?

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

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


Название: Re: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: Fat-Zer от Сентябрь 04, 2012, 21:34
если серверная часть, то можно задать, какой интерфейс слушать, а можно слушать всё подряд(0.0.0.0)...
если клиентская часть, то надо только задать к кому подключаться, а дальше маршрутизацией заведует ОС...

ЗЫ: в любом случае если TCP, то всё это на уровне ip адресов и портов, а не интерфейсов...
ЗЗЫ: FIXME


Название: Re: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: Serr500 от Сентябрь 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 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550%28v=vs.85%29.aspx))


Название: Re: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: kuzulis от Сентябрь 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);
 
   ...
}
 

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




Название: Re: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: Racot от Сентябрь 05, 2012, 17:06
Спасибо за ответы! похоже тут три варианта:
1) распихать карточки в разные подсети.
2) создать родной сокет->сделать bind() -> передать дескриптор кутишному сокету.
3) ждать стабильной версии Qt5 где bind() есть для TCP.

Я думаю вопрос снят)


Название: Re: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: demaker от Сентябрь 18, 2012, 10:19
А вот такой вопрос 1-карта -> 1 -устройство ?


Название: Re: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: Serr500 от Сентябрь 18, 2012, 10:32
Нет. Бывают "многоголовые" сетевые карты, т.е. одно устройство содержит несколько сетевых карт.


Название: Re: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: demaker от Сентябрь 18, 2012, 10:40
 :)а понятно.
Но bind же появится только в 5.0, а через setSocketDescriptor можно решить проблему?


Название: Re: Работа через 2 сетевых интерфейса(2 сетевые карты).
Отправлено: Serr500 от Сентябрь 18, 2012, 11:06
Сам не пробовал, но думаю, что да.