• 9450阅读
  • 13回复

求助~ UDP通信时 readyRead() 不响应 [复制链接]

上一主题 下一主题
离线wyg1990
 
只看楼主 倒序阅读 楼主  发表于: 2011-12-11
如题,发送端已经将数据发送到端口了,但是接收端却接收不到,主要是不发射readyRead()信号。这是什么原因啊~ 求各位大侠指导。
这是连接的语句
udpSocket.bind(44444,QUdpSocket::ShareAddress);
connect(&udpSocket,SIGNAL(readyRead()),this,SLOT(Receive()),Qt::DirectConnection);
离线summerpeking
只看该作者 1楼 发表于: 2011-12-11
这个应该是服务器端的代码吧,readyRead是有数据来到时发出的信号,要是能把源代码弄上来就能找到原因了!
离线wyg1990
只看该作者 2楼 发表于: 2011-12-11
我发现我现在最简单的通信都没有成功。
发送端
/*Widget.h*/
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtNetwork>

namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QUdpSocket *sender;

private slots:
    void on_pushButton_clicked();
};

#endif // WIDGET_H

/*Widget.cpp*/
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    sender = new QUdpSocket(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    QByteArray datagram = "hello world!";
    sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::LocalHost,45454);
}
离线wyg1990
只看该作者 3楼 发表于: 2011-12-11
接收端
/*Widget.h*/
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtNetwork>

namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QUdpSocket *receiver;

private slots:
    void processPendingDatagram();
};

#endif // WIDGET_H

/*Widget.cpp*/
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    receiver = new QUdpSocket(this);

    receiver->bind(45454,QUdpSocket::ShareAddress);

    connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
}

Widget::~Widget()
{
    delete ui;
}


void Widget::processPendingDatagram() //处理等待的数据报

{

    while(receiver->hasPendingDatagrams())  //拥有等待的数据报

    {

        QByteArray datagram; //拥于存放接收的数据报

        datagram.resize(receiver->pendingDatagramSize());

        //让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据

        receiver->readDatagram(datagram.data(),datagram.size());

        //接收数据报,将其存放到datagram中

        ui->label->setText(datagram);

        //将数据报内容显示出来

    }

}
离线wyg1990
只看该作者 4楼 发表于: 2011-12-11
离线wyg1990
只看该作者 5楼 发表于: 2011-12-11
就是发送端发送后 接收端不接受
离线wxj120bw

只看该作者 6楼 发表于: 2011-12-11
回 5楼(wyg1990) 的帖子
打印下面语句sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::LocalHost,45454);
返回结果

看下语句receiver->bind(45454,QUdpSocket::ShareAddress);返回结果
离线wyg1990
只看该作者 7楼 发表于: 2011-12-12
回 6楼(wxj120bw) 的帖子
试了一下,sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::LocalHost,45454); 和receiver->bind(45454,QUdpSocket::ShareAddress); 两句返回值都是true。 好奇怪,为什么我收不到
离线wxj120bw

只看该作者 8楼 发表于: 2011-12-12
回 7楼(wyg1990) 的帖子
你用wireshark类似工具检测下端口45454是否收到数据包
离线wyg1990
只看该作者 9楼 发表于: 2011-12-13
试了一下 貌似一个包都抓不到,我又用CMD查了一下端口的使用情况,发现接收端程序监听时是占用端口45454的,但是发送端发送数据时,虽然代码是向端口45454写入数据,但占用的端口确是不定的,每次运行都不一样
离线wyg1990
只看该作者 10楼 发表于: 2011-12-13
回 8楼(wxj120bw) 的帖子
这个会不会和电脑配置有关啊?
离线wyg1990
只看该作者 11楼 发表于: 2011-12-14
回 8楼(wxj120bw) 的帖子
今天在别人电脑上试了一下 ,貌似程序是对的,可以正常运行,不知道为什么我的电脑上不响应。
离线wyg1990
只看该作者 12楼 发表于: 2011-12-14
回 8楼(wxj120bw) 的帖子
昨天试了一下,发现是我电脑配置的问题。代码在别人机子上能正常运行。还是觉得挺奇怪的~
离线wxj120bw

只看该作者 13楼 发表于: 2011-12-14
回 12楼(wyg1990) 的帖子
你尝试过其他端口在本机运行程序吗 还有接收端应该是监听45454这个端口 不会跳到其他端口
快速回复
限100 字节
 
上一个 下一个