Russian Qt Forum

Qt => Работа с сетью => Тема начата: Yegor от Июнь 30, 2011, 19:38



Название: 2 раза установить дескриптор сокета
Отправлено: Yegor от Июнь 30, 2011, 19:38
Здравствуйте!

У меня есть tcp-сервер (QTcpServer). К нему пытаются установить подключения другие сокеты.
Я должен решать, каким сокетам можно подсоединиться, а каким нет. Критерий выбора - ip адрес.
Я проверяю разрешон ли ip адрес, так:

Код:
MyTcpServer::incomingConnection ( int socketDescriptor )
{
QTcpSocket *tmp_socket = new QTcpSocket(this);
tmp_soket->setSocketDescriptor(socketDescriptor);

if( tmp_socket->peerAddress().toString() == "192.168.2.2" )
{
tmp_socket->close();

//Главная строка! Повторное использование 'socketDescriptor'.
MyCustomSocket->setSocketDescriptor(socketDescriptor);
}
}

То есть если адрес разрешен, то я закрываю временный сокет, и передаю этот же дескриптор своему custom сокету (MyCustomSocket).

Можно ли так делать, использовать идин и тот же 'socketDescriptor' 2 раза, поочереди, в разных сокетах?

Повторяю, что после первого использования 'socketDescriptor', я закрывю сокет. Ведь в assistant написано, что нельзя использовать
одновременно 2 открытых сокета с одним и тем же .


Название: Re: 2 раза установить дескриптор сокета
Отправлено: LisandreL от Июнь 30, 2011, 19:47
Код
C++ (Qt)
MyTcpServer::incomingConnection ( int socketDescriptor )
{
QTcpSocket *tmp_socket = new QTcpSocket(this);
tmp_soket->setSocketDescriptor(socketDescriptor);
 
if( tmp_socket->peerAddress().toString() == "192.168.2.2" )
{
MyCustomSocket = tmp_socket;
}
          else
          {
                     tmp_socket->close();
          }
}
Нэ?


Название: Re: 2 раза установить дескриптор сокета
Отправлено: Yegor от Июнь 30, 2011, 20:40
Нет, не пойдет. Потому что MyCustomSocket - не объект класса QTcpSocket, а его наследник.


Название: Re: 2 раза установить дескриптор сокета
Отправлено: ddrtn от Июль 01, 2011, 06:20
Я так понимаю, что наследников от QTcpSocket  у Вас много. и в зависимости от ИП их нужно выбирать. В этом случае вместо наследования от QTcpSocket лучше сделать несколько классов-обработчиков, которые будут просто содержать своим членом указатель на  QTcpSocket. Наследование почти всегда может быть заменено агрегацией или композицией (вопрос в том, что удобней и красивее).

Код:
MyTcpServer::incomingConnection ( int socketDescriptor )
{
QTcpSocket *tmp_socket = new QTcpSocket(this);
tmp_soket->setSocketDescriptor(socketDescriptor);

if( tmp_socket->peerAddress().toString() == "192.168.2.2" )
{

MyCustomSocket->setSocket(tmp_socket);
}
}