Russian Qt Forum

Qt => Работа с сетью => Тема начата: RaZeR от Март 28, 2011, 18:08



Название: QTcpSocket и несколько интерфейсов
Отправлено: RaZeR от Март 28, 2011, 18:08
Всем привет.

Поставили задачу написать клиент для обмена пакетами по TCP протоколу.
Имеется:
МСВС, Qt 4.2.2 и 2 сетевых карточки.
Вопрос:
Как можно привязать QTcpSocket к конкретному интерфейсу(ip адрес и порт)? В итоге должно как бы быть два канала для обмена(2 QTcpSoket'а), каждый по своему интерфейсу через определенный порт общается со своим конкретным собеседником.
Пробовал setLocalAddress и setLocalPort,но что то не захотели они с QTcpSoket'ом работать. Есть ли аналог UDP'шного bind для TCP сокетов в QT или только неявно назначается порт и интерфейс через connectToHost?


Название: Re: QTcpSocket и несколько интерфейсов
Отправлено: vunder от Март 29, 2011, 12:24
Если у тебя 2 сетевые карты, то они должны иметь разные ip-адреса. Соответственно, куда тебе нужно подключаться, тот ip-адрес и указывай, в чем проблема то?


Название: Re: QTcpSocket и несколько интерфейсов
Отправлено: RaZeR от Март 29, 2011, 18:00
я может не верно понимаю конечно работу функции connectToHost, но помоему там указывает ip адрес и порт того с кем связываешься, а вопрос в том как заставить каждый сокет через свою сетевуху слать, т.е. грубо говоря на моей машине ip:1.1.1.1 и 1.1.2.1, на другой стороне 1.1.1.2 и 1.1.2.2. 1-й QTcpSoket должен слать с сетевухи 1.1.1.1 и определенного порта на удаленную сторону в адрес 1.1.1.2, 2-й сокет соответственно через второй сетевой интерфейс. в connectToHost я указываю на какой адрес и порт буду данные слать, а вот как заставить слать с определенного адреса и порта?


Название: Re: QTcpSocket и несколько интерфейсов
Отправлено: Командор от Март 29, 2011, 21:45
Один мой товарищ делал что-то подобное, говорил что лучше всего использовать роутинг. Т.е. проблему решать на уровне операционки. В принципе это логично - в API или tool-ките обеспечивается базовая работа с сокетами, а все навороты типа фильтрации и направления реализовать с помощью ОС, потому как это очень сильно завязано на ОС.


Название: Re: QTcpSocket и несколько интерфейсов
Отправлено: RaZeR от Март 30, 2011, 05:59
Спасибо за совет, это наверное единственный выход из данной проблемы.


Название: Re: QTcpSocket и несколько интерфейсов
Отправлено: CuteBunny от Март 30, 2011, 08:35
SetLocalAddress и SetLocalPort не пробовали на стороне клиента?


Название: Re: QTcpSocket и несколько интерфейсов
Отправлено: RaZeR от Март 30, 2011, 17:30
с QTcpSocket'ом почему то не смог заставить работать их....ошибку выдавали,хотя возможно такой код неверен:
QTcpSocket *tcpClient = new QTcpSocket(this);
tcpClient->setLocalPort(1035);
ну и дальше tcpClient->connectToHost и т.д.


Название: Re: QTcpSocket и несколько интерфейсов
Отправлено: CuteBunny от Март 31, 2011, 03:46
Из документации по QAbstractSocket у методов SetLocalPort и SetLocalAddress написано замечание:
Цитировать
Note that this function does not bind the local port of the socket prior to a connection (e.g., QUdpSocket::bind()).

Т.е. наверное надо в начале вызвать метод connectToHost, а потом эти методы, насколько я понимаю.


Название: Re: QTcpSocket и несколько интерфейсов
Отправлено: RaZeR от Март 31, 2011, 19:38
ошибка не о том что до или после connectToHost использую, а о том что они в protected находятся у QAbstractSocket и подобный вызов неправилен.