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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: 2 раза установить дескриптор сокета  (Прочитано 3007 раз)
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 открытых сокета с одним и тем же .
« Последнее редактирование: Июнь 30, 2011, 20:38 от Yegor » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июнь 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();
          }
}
Нэ?
Записан
Yegor
Гость
« Ответ #2 : Июнь 30, 2011, 20:40 »

Нет, не пойдет. Потому что MyCustomSocket - не объект класса QTcpSocket, а его наследник.
Записан
ddrtn
Гость
« Ответ #3 : Июль 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);
}
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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