2016-02-29 2 views
1

Я совершенно новый при использовании QtNetwork для подключения компьютеров.Простой код Qt для сетевого упрощенного сетевого подключения

Прямо сейчас все, что я хочу, это увидеть попытку подключения. Поэтому я создаю приложение с графическим интерфейсом и на mainwindow.cpp я пишу эти две функции как слоты для двух кнопок:

void MainWindow::on_pbTalk_clicked(){ 
    QString IP = ui->leIP->text(); 
    ui->pteLog->appendPlainText("Now Talking to IP: " + IP); 
    talker = new Talker(); 
    talker->connectToHost(IP,25000); 
} 

void MainWindow::on_pbListen_clicked(){ 
    ui->pteLog->appendPlainText("Now listening on any port, I think"); 
    listener = new Listener(this); 
    if (!connect(listener, SIGNAL(newConnection()), this, SLOT(on_newConnections()))){ 
     ui->pteLog->appendPlainText("The connection of slot and signal failed!"); 
    } 
} 

Теперь Говорун по существу QTcpSocket нет ничего переписано только пока.

Слушатель является QTcpServer с кодом мошенника Listener.cpp:

Listener::Listener(QObject *parent) : 
    QTcpServer(parent) 
{ 

    qDebug() << "Listening on any port"; 
    listen(QHostAddress::Any); 

} 

void Listener::incomingConnection(int socketDescriptor){ 
    qDebug() << "New connection: " << socketDescriptor; 
} 

Так что я запустить два экземпляра одного и того же программы. Один в моей машине. Я запускаю программу и нажимаю кнопку «Слушать» (IP 10.255.255.101).

Второй экземпляр запускается на виртуальной машине (IP 10.255.255.215), где я запускаю программу и нажимаю кнопку «Разговор». Это, как я понимаю, должен попытаться открыть соединение с IP (10.255.255.101) в порту 25000, и я должен получить сообщение «Новое соединение» в консоли. Однако такое сообщение не появляется. И поскольку это не работает, я не двигаюсь дальше.

Может ли кто-нибудь сказать мне, что я могу делать неправильно?

ответ

3

Проверьте documenation из QTcpServer::listen - он говорит:

Сообщает серверу для прослушивания входящих соединений по адресу адрес и порта порта. Если порт равен 0, порт выбирается автоматически. Если адрес QHostAddress :: Any, сервер будет прослушивать всю сеть интерфейсов.

QHostAddress::Any означает, что вы слушаете все сетевые интерфейсы, а не порты. . (Например, если вы хотите иметь только локальный сервер, вы можете использовать QHostAddress::LocalHost - проверить QHostAddress::SpecialAddress больше как то

Если вы хотите установить порт вручную, вы должны вызвать:

listen(QHostAddress::Any, 25000); 

Если нет, то вы можете получить автоматически выбранный порт по телефону

quint16 port = serverPort(); 
+0

Сообщение (текст, который я написал на консоли) было неправильным и не понимало. И так как я следовал примеру, который не использовал порт .... Ошибка. Теперь это сработало. Мой плохой для того, чтобы не читать документацию. Большое спасибо. – aarelovich

0

«слушать на любом порту» идиома не доступны для использования, это не так, как UDP и TCP были предназначены для использования скорее всего. вы не должны разрабатывать свои сообщения таким образом. e выделенный порт.

Если вы хотите создать пакетный снифер, вам придется использовать специально разработанные для платформы механизмы. Существуют библиотеки, которые помогут вам с этой задачей, наиболее заметным будет WinPcap на Windows и кросс-платформенный libpcap из проекта TcpDump.

Смежные вопросы