Russian Qt Forum

Qt => Работа с сетью => Тема начата: Yegor от Сентябрь 06, 2011, 15:46



Название: QTcpSocket::peerPort()
Отправлено: Yegor от Сентябрь 06, 2011, 15:46
QTcpSocket::peerPort()

Здравствуйте! Помогите мне, пожалуйста, разобраться с сокетами: QTcpSocket::peerPort().

Имею 2 программы, которые связываются с помощью сокетов.
Первая сторона - сервер, вторая - клиент.


На стороне клиента делаю запрос на соединение с серером:

Код:
QTcpSocket *MySocket = new QTcpSocket(this);
QString ip = "127.0.0.1";
quint16 port = 8001;
MySocket->connectToHost(ip,port);

На стороне сервера принимаю входящее соединение:
Код:
//virtual
MyTcpServer::incomingConnection ( int socketDescriptor )
{
QTcpSocket *access_socket = new QTcpSocket(this);
access_socket->setSocketDescriptor(socketDescriptor);

//Входящий ip принимается нормально.
QString ip = accessSocket->peerAddress(); //Возвращает '127.0.0.1'.

//А входящий порт - неправильно!
quint16 port = access_socket->peerPort(); //Возвращает 62806. Не равно ожидаемому (должно быть 8001).
}
Метод 'incomingConnection' срабатывае, когда приходит входящее соединение, но внутри метода не возвращается из сокета нормальный номер порта.

Входящий ip, port я контролирую, чтобы ограничить доступ - только для сторон с разрешенными ip, port давать соединяться.

Как сделать, чтобы 'peerPort' возвращало правильное значение?
Правильно ли я понял про применение и назначние 'peerPort' ?

Помню, еще в Qt3 был аналог этого метода: 'pendingPort'.


Название: Re: QTcpSocket::peerPort()
Отправлено: BRE от Сентябрь 06, 2011, 16:07
Все он возвращает правильно! :)
Две стороны - два сокета. У каждого должен быть свой порт. Первый задаешь ты, второй выбирает ОС из свободных.
Не нужно контролировать порт клиента, он может постоянно меняться.



Название: Re: QTcpSocket::peerPort()
Отправлено: Yegor от Сентябрь 10, 2011, 15:57
А как же тогда установить принудительно свой порт для сокета, чтобы именно этот порт я и смог увидеть на другой стороне сети. Увидеть с помощью peerPort().


Название: Re: QTcpSocket::peerPort()
Отправлено: LisandreL от Сентябрь 10, 2011, 16:56
А как же тогда установить принудительно свой порт для сокета, чтобы именно этот порт я и смог увидеть на другой стороне сети. Увидеть с помощью peerPort().
На стороне сервера вы этот установленный порт можете увидеть при помощи localPort().


Название: Re: QTcpSocket::peerPort()
Отправлено: Yegor от Сентябрь 11, 2011, 16:41
Я имею ввиду как установить принудительно номер порта для сокета?


Название: Re: QTcpSocket::peerPort()
Отправлено: LisandreL от Сентябрь 11, 2011, 18:55
Рискну предположить, что Qt не предоставляет функционала установки обратных портов, оставляя их выдачу на откуп ОС.
Конечно вы можете унаследоваться от QTcpSocket и получить доступ к setPeerPort, но насколько я понимаю реально он обратный порт не меняет.