2014-10-20 8 views
2

QUdpSocket에 문제가 있습니다. UDP protokol을 사용하여 데이터를주고받는 간단한 프로그램을 만들고 싶습니다. 이미 많은 비슷한 주제를 읽었지만 해결되지 않은 것으로 나타났습니다. 통신은 QHostAdress::LocalHost에 대해서만 작동합니다. 그런 다음 send와 동일한 데이터를 제공합니다. 그러나 예를 들어 194.181.161.134과 같이 구체적인 주소 외부로 데이터를 보내려면 작동하지 않습니다. 데이터가 전송된다는 의미지만받을 수는 없습니다. 이건 내 코드입니다 :QUdpSocket : 프로그램을 보내지 만받을 수 없습니다.

class Okno_GL : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    explicit Okno_GL(QWidget *parent = 0); 
    QWidget *wg; 
    QPushButton *pb; 
    QPushButton *pl; 
    QGridLayout *gr; 
    QUdpSocket *socket; 
    QHostAddress host; 
    QHostAddress bcast; 


signals: 

public slots: 
    void SLOT_Write(); 
    void SLOT_load();   
}; 

class Receiver : public QObject 
{ 
    Q_OBJECT 
public: 
    Receiver(); 

    QUdpSocket *udpSocket; 
public slots: 
    void SLOT_processPendingDatagrams(); 
    void SLOT_StCh(QAbstractSocket::SocketState state); 
}; 

Okno_GL::Okno_GL(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    pb = new QPushButton("write" , this); 
    pl = new QPushButton("read" , this); 
    wg = new QWidget(this); 
    setCentralWidget(wg); 
    gr = new QGridLayout(wg); 
    gr->addWidget(pb); 
    gr->addWidget(pl); 
    socket = new QUdpSocket(this); 

    connect(pb , SIGNAL(clicked()) , SLOT(SLOT_Write())); 
    connect(pl , SIGNAL(clicked()) , SLOT(SLOT_load())); 

} 

void Okno_GL::SLOT_Write() 
{ 
     QByteArray datagram = "gS"; 
     int send; 
     send = socket->writeDatagram(datagram.data(), QHostAddress("194.181.161.134"), 1200);  
} 

void Okno_GL::SLOT_load() 
{ 

} 


Receiver::Receiver() 
{ 


    udpSocket = new QUdpSocket(this); 
    connect(udpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)) , this , SLOT(SLOT_StCh(QAbstractSocket::SocketState))); 

    if(udpSocket->bind(QHostAddress::Any , 1200)) 
    { 
     qd "bind"; 
    } 
    else 
    { 
     qd "not bind"; 
    } 

} 

void Receiver::SLOT_processPendingDatagrams() 
{ 
    qd "receiver"; 
    QByteArray datagram; 

     do { 
      datagram.resize(udpSocket->pendingDatagramSize()); 
      udpSocket->readDatagram(datagram.data(), datagram.size()); 
     } while (udpSocket->hasPendingDatagrams()); 

    qd "datagram" << datagram; 
} 

void Receiver::SLOT_StCh(QAbstractSocket::SocketState state) 
{ 
    qd "slot" << state; 

    QByteArray datagram = "gS"; 
    if (state == QAbstractSocket::BoundState) { 

      connect(udpSocket, SIGNAL(readyRead()), this, SLOT(SLOT_processPendingDatagrams()) , Qt::QueuedConnection); 
     } 

} 
+0

는 'Receiver'의 어딘가에 생성 된 개체입니까 ?? – Blueman

+0

확인해야 할 중요한 사항 중 하나 : 수신 시스템에서 Wireshark의 패킷을 볼 수 있습니까? – jturcotte

+0

죄송합니다. ofcourse 오브젝트 수신자는 오브젝트 Okno_GL과 동일하게 메인에서 작성됩니다. Ofocourse firs는 Creetet Okno_GL입니다. jtucotte ok 내가 이것을 씹어 답장을했다. – FanQt

답변

1

당신은 대신 write()를 사용해야합니다 writeDatagram()

qint64 QUdpSocket :: writeDatagram (const를 숯불 * 데이터, qint64 크기, CONST QHostAddress & 주소, quint16 포트)

경고 : 연결된 UDP 소켓에서이 함수를 호출하면 에 오류가 발생하고 패킷이 전송되지 않을 수 있습니다. 연결된 소켓을 사용하는 경우 write()를 사용하여 데이터 그램을 보냅니다.

1

그래서 제안서에 따라 코드를 다시 작성합니다. 나는이 클래스를 construktor 클래스 Okno_GL에 추가했다. 여기

socket = new QUdpSocket(this); 
socket->connectToHost(QHostAddress("194.181.161.134") , 1200); 

은 변경되지

void Okno_GL::SLOT_Write() 
{ 
     QByteArray datagram = "gS"; 
     int send; 
//   send = socket->writeDatagram(datagram.data(), QHostAddress("194.181.161.134"), 1200); 
     send = socket->write(datagram); 
     qd " send" << send; 

} 

수신기 코드를 전송하는 슬롯, 그래서 신호 readRedy()에 대한 I 여전히 흰색, 나는 그 후 데이터를 전송하지 않습니다.

추신. 나는 connetc에 다른 옵션이 있다는 것을 추가하는 것을 좋아하지만, 매우 간단하게 파일 명령 * 박쥐가 문제없이이 호스트에 연결됩니다. 이것은 내 네트워크 나 관리자가 아무 것도 차단하지 못한다는 것을 증명합니다 (포트, IP).

관심을 가져 주셔서 감사합니다.

문제가 해결되었습니다. 그것은 매우 어리석은 실수입니다. 나는 3 바트 대신 2를 보내야한다. 3 바트는 0x0D이다. 다음 코드는 작업

socket = new QUdpSocket(this); 
socket->bind(QHostAddress::Any, 1200); 

및 신호 readyRead를

QByteArray datagram = "gS"; 
datagram.append(0x0D); 
int send; 
send = socket->writeDatagram(datagram.data(), QHostAddress("194.181.161.134"), 1200); 

를 보내고 후 수신()

qd "receiver"; 
     QByteArray datagram; 

      do { 
       datagram.resize(socket->pendingDatagramSize()); 
       socket->readDatagram(datagram.data(), datagram.size()); 
      } while (socket->hasPendingDatagrams()); 

     qd "datagram" << datagram; 

아주 마일 와이어 샤크 도움이됩니다. 모두에게 감사합니다