网络UDP广播能自己电脑通信,无法将数据包发给别的电脑的问题

网络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,它的网卡导致的,需要禁用

步骤如下:

image-20231227202454323

image-20231227202539940

记录一下,怕自己以后忘记,自己将虚拟机的网卡关掉了。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值