Qt Запись в сокет UDP на компьютере с Linux и чтение Windows из сокета с помощью Python

=========== ОБНОВЛЕНИЕ: ===========

Теперь я использую широковещательный IP-адрес 10.6.0.3 и более высокий порт, 57890. Я вижу трафик в сетевом мониторе Windows, но все еще не могу заставить Python его прочитать.

==============================

У меня есть Linux-машина, которая пишет приветственное сообщение в сокет UDP по IP-адресу 10.6.0.2, используя Qt и QUDPSocket. У меня также есть машина с Windows, на которой я хочу прочитать это приветственное сообщение с помощью Python. Из моего кода Qt я вижу, что данные записываются, однако программа Python в Windows вечно сидит в «Ожидание данных». Машина Windows действительно может пинговать 10.6.0.2. Что я делаю не так?

Последовательность испытаний:

UdpBroadcaster client; // Binds socket
sleep(10); // During this time , startup Python program
client.WriteData(); // Write hello message

Выход Qt:

Initializing UDP Socket 
Determined ip address to be:  "10.6.0.2" 
Successfully bound to:   QHostAddress( "10.6.0.2" )   Port:  5678 
Sending UDP Datagram now! 
Wrote this many bytes:  8 
Message From:  "10.6.0.2" 
With Port Number  5678 
Message:  "Hello!!!" 

QT-код:

// Constructor
UdpBroadcaster::UdpBroadcaster(QObject *parent) :QObject(parent)

{

    // Init socket
    m_UdpSocket = new QUdpSocket(this);

    // Figure out our ip address to broadcast on
    QString ipAddress;
    foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) {
        if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost))
            if ( address.toString().contains("10.") ) {
                ipAddress = address.toString();
                qDebug() << "Determined ip address to be: " << ipAddress;
                break;
            }
    }

    // Bind to localhost
    m_Port = 5678;
    m_AddressToUse = QHostAddress(ipAddress);
    bool didBind = m_UdpSocket->bind(m_AddressToUse,m_Port);
    if ( !didBind ) {
        qDebug() << "Error! Cannot bind to: " << m_AddressToUse << " Port: " << m_Port;
    }
    else {
        qDebug() << "Successfully bound to: " << m_AddressToUse << " Port: " << m_Port;
    }

    // Connect the ready read socket
    connect(m_UdpSocket,SIGNAL(readyRead()),this,SLOT(readReady()));

}

// Write data to socket
void UdpBroadcaster::WriteData() {

    // Debug
    qDebug() << "Sending UDP Datagram now!";

    // Construct a message to send
    QByteArray msg;
    msg.append("Hello!!!");
    qint64 numberOfBytesWritten = m_UdpSocket->writeDatagram(msg,m_AddressToUse,m_Port);
    if ( numberOfBytesWritten == -1 ) {
        qDebug() << "Error! Could not write data to socket...";
    }
    else {
        qDebug() << "Wrote this many bytes: " << numberOfBytesWritten;
    }

}

// Do this when a datagram is available
void UdpBroadcaster::readReady() {

    // Buffer to receive data
    QByteArray buffer;
    buffer.resize(m_UdpSocket->pendingDatagramSize());

    QHostAddress sender;
    quint16 port;
    m_UdpSocket->readDatagram(buffer.data(),buffer.size(),&sender,&port);

    qDebug()<<"Message From: " << sender.toString();
    qDebug()<<"With Port Number " << port;
    qDebug()<<"Message: " << buffer;

}

Программа Python:

import socket
import time

def main():

    UDP_IP = "10.6.0.2"
    UDP_PORT = 5678

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.connect((UDP_IP, UDP_PORT))
    cnt = 0
    while cnt < 10:
        print "Waiting for data"
        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        print "received message:", data
        time.sleep(1)
        cnt = cnt + 1

    ## Wait so we don't lose our terminal
    filename = raw_input()            

if __name__ == '__main__':
    main()

person PhilBot    schedule 28.04.2014    source источник
comment
Попробуйте использовать netcat, также известную как nc, в качестве отправителя или получателя для отладки вашего кода. Он невероятно прост в использовании и доступен для Windows, Mac и Linux.   -  person Mark Setchell    schedule 29.04.2014


Ответы (1)


Мне пришлось разрешить мою программу через брандмауэр Windows 7. Теперь он работает нормально.

person PhilBot    schedule 29.04.2014