2016-10-24 5 views
1

Я видел несколько потоков о моем вопросе, но, по-прежнему, я не могу решить проблему, и ответов недостаточно. Итак, вот задача: у меня 2 ПК. Необходимо передать 100 udp-пакетов с простыми тестовыми данными, а другая машина должна прочитать дейтаграммы. Мой код выглядит следующим образом:Удаленный хост клиента-сервера QUдpSocket не подключается

Сервер:

m_socket.udp = новый QUdpSocket (это);

if (m_socket.udp->bind(QHostAddress("192.168.32.154"), 1234)) { 
    m_socket.udp->connectToHost(QHostAddress("192.168.32.154"), 1234); 
    m_socket.udp->waitForConnected(); 
} 
connect(m_socket.udp, SIGNAL(connected()), 
     this, SLOT(handleConnection())); 
connect(m_socket.udp, SIGNAL(readyRead()), 
     this, SLOT(readyReadUdp())); 

Итак ... сначала - привязка к IP-адресу машины 1 не удалась. Я не должен указывать его IP.

Клиент прост:

p_socket = new QUdpSocket(this); 
p_socket->connectToHost(QHostAddress("192.168.32.94"), 1234); 
connect(p_socket, SIGNAL(connected()), this, SLOT(writeDgram())); 
.... 
void writeDgram() { 
    p_socket->write(QByteArray("test")); 
} 

Так клиентский код, как показано на Wireshark, приходит к моей машине сервера. Но мой серверный код Qt меня сбивает. Любая помощь здесь?

+0

Не могли бы вы быть более конкретными? Что вы видите в wirehark? что вы подразумеваете под «первым - сбой связи с IP-машиной 1»? – Prabhu

+0

Я привязываюсь к удаленному хосту, например: 192.168.32.150 с портом 1234, который был бы машиной 1, и от 192.168.32.150 Я отправляю 100 датаграмм на ожидающую машину. Простой пример, который соединяет 2 UDP-сокета, будет отличным. Но пример должен быть между двумя компьютерами. –

+0

Разве сложно обменивать несколько дейтаграмм между двумя машинами? Еще нет ответов? –

ответ

1

Тем не менее, никто не предложил, чтобы я мог быть защищен брандмауэром. Это была проблема. Удаление брандмауэра решило это.

0

я установки другого сокета UDP для обработки входящих соединений, что путь:

void Server::handleConnection() 
{ 
    std::cout << "Connected to host" << std::endl; 
    m_inaddr = new QUdpSocket(this); 
    connect(m_inaddr, SIGNAL(readyRead()), 
      this, SLOT(readyReadUdp())); 

    QHostAddress addr = m_socket.udp->peerAddress(); 
    quint16 port = m_socket.udp->peerPort(); 

    bool conn = m_inaddr->bind(45678); 

    if (conn) { 
     m_inaddr->connectToHost(addr, port); 
     std::cout << "Bound to: " << addr.toString().toStdString() 
        << " port:" 
        << port << std::endl; 
    } 

} 

Но, похоже, это не работает надлежащим образом. Когда я подключен, я могу прочитать узел-концентратор и порт, но вспомогательный сокет для inaddress должен быть привязан к чему? Я путаюсь с UDP. [EDIT] Просто добавлю, что я никогда не ломаю в слоте readyReadUdp(), я поставил там точку останова. Читатель является стандартным, но слот никогда не называется. Поэтому, я думаю, нет ничего готового для чтения.