Qt,通过VPN发送UDP(Hamachi)

时间:2014-09-28 09:40:55

标签: c++ qt sockets udp

我正在编写应用程序,它将语音从一台计算机发送到另一台计算机。我简单地实现了" sender"

VoiceSender::VoiceSender(QAudioFormat &format, QString ip){
    input = new QAudioInput(format);
    QUdpSocket* socket = new QUdpSocket();
    socket->connectToHost(ip, 14433);
    input->start(socket);
}

只需从麦克风获取所有数据并将其作为UDP发送到指定的IP。

另一方面,我有程序,它获取UDP接收的所有数据,并通过音频系统播放

Interlocutor::Interlocutor(QAudioFormat &format){
    socket = new QUdpSocket();
    socket->bind(QHostAddress::Any, 14433);
    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
        if (!info.isFormatSupported(format))
            format = info.nearestFormat(format);
    output = new QAudioOutput(format);
    device = output->start();
    connect(socket, SIGNAL(readyRead()), this, SLOT(playData()));
}

void Interlocutor::playData()
{
    qDebug() << QDateTime::currentDateTime();
    while (socket->hasPendingDatagrams())
    {
        QByteArray data;
        data.resize(socket->pendingDatagramSize());
        socket->readDatagram(data.data(), data.size());
        device->write(data.data(), data.size());
    }
}

如果两台计算机都位于本地网络中,这种方法运行良好,我可以在计算机之间传输语音。我试图在VPN中运行它。为此,我在两台计算机上运行Hamachi,什么也没得到。永远不会调用Slot playData()。我运行Wireshark并看到计算机获得UDP包,但Qt没有。我该怎么做才能解决它。

感谢。

1 个答案:

答案 0 :(得分:0)

您应该检查QUdpSocket :: bind函数的结果。

bool QUdpSocket::bind(const QHostAddress&amp; address,quint16 port)

  

成功时,函数返回true并进入套接字   BoundState;否则返回false。

if (!socket->bind(QHostAddress::Any, 14433))
{
    QMessageBox::warning(0, "Error", "Binding Failed");
}

如果绑定失败,请检查防火墙是否阻止您,或者该端口未被其他应用程序使用。