winsock编程-使用Qt,多线程

本文介绍如何在Qt环境中进行Winsock编程,通过多线程实现网络通信。首先,创建Widgets Application,接着在.pro文件中添加相关配置。然后设计用户界面,并分别编写main.cpp、mainwindow.cpp、mainwindow.h等组件的代码,实现发送和接收数据的等待及发送功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机网络实验坑有点多,感谢同学的帮助。

1.使用Qt creator创建widgets application。

2.在项目中的.pro文件中添加一句

LIBS += -lpthread libwsock32 libws2_32

3.编写界面大致如图所示,然后就能开始代码编写了。

4.main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle("Web 服务器");
    w.show();
    return a.exec();
}

5. mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "waiting.h"
#include<winsock2.h>
#include <QDebug>
#include<QFile>
#include<QFileDialog>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_pushButton_clicked()
{
    if(ui->lineEdit->text()==""||ui->lineEdit_2->text()=="")
    {
        ui->textEdit->append("Warning,请输入IP地址和端口号!");
        return;
    }
    else if(ui->lineEdit_3->text()=="")
    {
        ui->textEdit->append("Warning,请输入文件路径!");
    }
    //验证版本
    int nRc = WSAStartup(0x0101, & wsaData);
    if(nRc)
    {
    //Winsock初始化错误
        return;
    }
    if(wsaData.wVersion != 0x0101)
    {
    //版本支持不够
    //报告错误给用户,清除Winsock,返回
        ui->textEdit->append("版本出现问题!");
        WSACleanup();
        return;
    }
    //创建套接字
    mysocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    ui->textEdit->append("Socket 创建成功.");
    //bind
    sockaddr_in addr;
    addr.sin_family = AF_INET;

    //htons和htonl函数把主机字节顺序转换为网络字节顺序,分别用于//短整型和长整型数据
    addr.sin_port = htons(5050);
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

    // LPSOCKADDR类型转换是必须的
    nRc = bind(mysocket, LPSOCKADDR(&addr), sizeof(addr) );
    if(nRc == SOCKET_ERROR)
    {
        ui->textEdit->append("bind error!");
        return;
    }
    ui->textEdit->append("Bind 成功.");
    //listen
    listen(mysocket,10);
    ui->textEdit->append("Listen 成功.");
    //创建新线程
    waiting = new Waiting(mysocket,path);
    //当isMsg触发时即进行操作
    connect(waiting,&Waiting::isMsg,this,[=](QString msg){
        ui->textEdit->append(msg);
    });
    waiting->start();
}

void MainWindow::on_pushButton_2_clicked()
{
    waiting->terminate();
    waiting->quit();
    waiting->wait();
    delete waiting;
    ::closesocket(mysocket);
    ui->textEdit->setText("");
    ui->textEdit->append("Socket clossed.");
}

void MainWindow::on_toolButton_clicked()
{
    path=QFileDialog::getExistingDirectory(this, "打开文件", "‪.");
    ui->lineEdit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值