网络UDP广播能自己电脑通信,无法将数据包发给别的电脑的问题
尝试了关闭防火墙但是都没有用。
源码:
#include "widget.h"
#include "ui_widget.h"
#include<QDataStream>
#include<QMessageBox>
#include<QDateTime>
Widget::Widget(QWidget *parent,QString name)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->myname=name;
port=8888;
udpSocket=new QUdpSocket(this);
//允许其他服务器连接相同端口和地址|重新连接服务器
udpSocket->bind(port,QUdpSocket::ShareAddress |QUdpSocket::ReuseAddressHint);
connect(udpSocket,&QUdpSocket::readyRead,this,&Widget::ReceiveMessage);
//连接发送按钮
connect(ui->sendBtn,&QPushButton::clicked,[=](){
sndMsg(Msg);
});
//新用户进入
sndMsg(UserEnter);
//退出按钮
connect(ui->exitBtn,&QPushButton::clicked,[=](){
this->close();
});
}
void Widget::closeEvent(QCloseEvent *){
emit this->closewidget();
sndMsg(UserLeft);
udpSocket->close();
udpSocket->destroyed();
}
void Widget::sndMsg(Msgtype type)
{
QByteArray array;
QDataStream stream(&array,QIODevice::WriteOnly);
stream<<type<<this->getName();
switch (type) {
case Msg:
if(ui->msgTxtEdit->toPlainText()==""){
QMessageBox::warning(this,"警告","发送信息不能为空");
return;
}
stream<<this->getMsg();
break;
case UserEnter:
break;
case UserLeft:
break;
}
//书写报文
udpSocket->writeDatagram(array.data(),array.size(),QHostAddress::Broadcast,this->port);
}
QString Widget::getName(){
return myname;
}
QString Widget::getMsg()
{
QString msg=ui->msgTxtEdit->toHtml();//返回输入框的内容
ui->msgTxtEdit->clear();//清空内容
ui->msgTxtEdit->setFocus();//设置光标
return msg;
}
void Widget::userEnter(QString username)
{
bool IsEmpty=ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty();
if(IsEmpty){
QTableWidgetItem *table=new QTableWidgetItem(username);
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0,0,table);
ui->msgBrowser->setTextColor(QColor(Qt::gray));
ui->msgBrowser->append(username+"已上线");
ui->userNumLbl->setText(QString("在线人数:%1").arg(ui->tableWidget->rowCount()));
sndMsg(UserEnter);
}
}
void Widget::userLeft(QString username, QString time)
{
bool IsEmpty=ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty();
if(!IsEmpty){
int row=ui->tableWidget->findItems(username,Qt::MatchExactly).first()->row();
ui->tableWidget->removeRow(row);
ui->msgBrowser->append(QString("%1用户于%2离开").arg(username,time));
ui->userNumLbl->setText(QString("在线人数:%1").arg(ui->tableWidget->rowCount()));
}
}
void Widget::ReceiveMessage()
{
qint64 size=udpSocket->pendingDatagramSize();
int mysize=static_cast<int>(size);
QByteArray *array=new QByteArray(mysize,0);
udpSocket->readDatagram((*array).data(),size);
QDataStream stream(array,QIODevice::ReadOnly);
int mytype;
stream>>mytype;
QString name,msg;
QString time=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
switch (mytype) {
case Msg:
stream>>name>>msg;
ui->msgBrowser->setTextColor(QColor(Qt::blue));
ui->msgBrowser->append("["+name+"]"+time);
ui->msgBrowser->append(msg);
break;
case UserLeft:
stream>>name;
userLeft(name,time);
break;
case UserEnter:
stream>>name;
userEnter(name);
break;
}
}
Widget::~Widget()
{
delete ui;
}
原因:
我的电脑上安装了vmware,它的网卡导致的,需要禁用
步骤如下:
记录一下,怕自己以后忘记,自己将虚拟机的网卡关掉了。