按照协议生成了一个数据报,怎么使用writeDatagram()发送?

longfeiah 2015-01-07 10:17:11
数据报的格式是8位16进制的数据,像这样:0x01,0x04,0x00,0x00,0x00,0x02,0x71,0xcb。使用writeDatagram()发送,怎么存储这个数据报呢?
...全文
1603 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
振星 2015-01-08
  • 打赏
  • 举报
回复
receiver=new QUdpSocket(this); 这个需要先绑定端口 receiver->bind(QHostAddress::AnyIPv4, iPort, QUdpSocket::ReuseAddressHint);绑定端口 receiver->joinMulticastGroup(groupAddress); // 加入组播
longfeiah 2015-01-07
  • 打赏
  • 举报
回复
引用 2 楼 bsbsxll 的回复:
使用QByteArray 存储,然后直接writeDatagram()即可
现在这个问题解决了,writeDatagram()发送数据成功。正常的话,会触发readyRead()信号,然后读取readDatagram()。可是现在读取不到信息,代码如下:

#include<QNetworkInterface>
#include<QMessageBox>
#include<QHostInfo>
#include"wr.h"


Wr::Wr(QWidget *parent)
	:QWidget(parent)
{
	tem=new QLabel(tr("tem:"));
	LineEdittem=new QLineEdit;
	hum=new QLabel(tr("hum:"));
	LineEdithum=new QLineEdit;

	send=new QPushButton(tr("send"));

	mainLayout=new QGridLayout(this);
	mainLayout->addWidget(tem,0,0);
	mainLayout->addWidget(LineEdittem,0,1);
	mainLayout->addWidget(hum,1,0);
	mainLayout->addWidget(LineEdithum,1,1);
	mainLayout->addWidget(send,2,0,1,2);

	setWindowTitle("Network");

	connect(send,SIGNAL(clicked()),this,SLOT(sendm()));
	
	//port=8000;
	sender=new QUdpSocket(this);
	receiver=new QUdpSocket(this);
	//receiver->bind(8000,QUdpSocket::ShareAddress);
	connect(receiver,SIGNAL(readyRead()),this,SLOT(readm()));

}

void Wr::sendm()
{
	//char str[128]={0x01,0x04,0x00,0x00,0x00,0x02,0x71,0xcb};
	QByteArray ba;
	ba.resize(8);
	ba[0]=0x01;
	ba[1]=0x04;
	ba[2]=0x00;
	ba[3]=0x00;
	ba[4]=0x00;
	ba[5]=0x02;
	ba[6]=0x71;
	ba[7]=0xcb;
	qint64 len;
	QHostAddress adr=QHostAddress("192.168.1.33");

	//len=udpsocket->writeDatagram(str,32,adr,port);
	len=sender->writeDatagram(ba,adr,8000);

	if(len==-1)
	{
		QMessageBox::information(this,tr("error"),tr("writedatagram failed!"));
		return;
	}
	qDebug()<<"yes"<<len;
}

void Wr::readm()
{
	while(receiver->hasPendingDatagrams())
	{
		qDebug()<<"hasPendingDatagrams";
		QByteArray datagram;
		qint64 rlen;
		datagram.resize(receiver->pendingDatagramSize());
		QHostAddress sendip;
		quint16 senderPort;

		rlen=receiver->readDatagram(datagram.data(),datagram.size(),&sendip,&senderPort);
		//qDebug()<<datagram.data()<<datagram.size()<<senderPort<<sender.toString();

		if(rlen==-1)
		{
			QMessageBox::information(this,tr("error"),tr("readdatagram failed!"));
			return;
		}
		qDebug()<<datagram.data()<<datagram.size()<<senderPort<<sendip.toString();
	}
}
振星 2015-01-07
  • 打赏
  • 举报
回复
使用QByteArray 存储,然后直接writeDatagram()即可
longfeiah 2015-01-07
  • 打赏
  • 举报
回复
解决了,用QByteArray存储

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧