计算机网络实验坑有点多,感谢同学的帮助。
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