libevent服務器附帶qt界面開發(附帶源碼)

本章是入門章節,講解如何實現一個附帶界面的服務器,后續會完善與優化

  • 使用qt編譯libevent
  • 源碼
  • 演示視頻
  • qt的一些知識

在這里插入圖片描述
1.主要功能有登錄界面
2.基于libevent實現的服務器的業務功能

使用qt編譯libevent

下載這個,其他版本也可以
主要是github上下載,可能有點卡
鏈接: link
在這里插入圖片描述
在這里插入圖片描述
編譯流程
1.打開qt然后點下面的紅框
在這里插入圖片描述
2.選cmakelist
在這里插入圖片描述
3.選編譯器在這里插入圖片描述
4.最后一步編譯
在這里插入圖片描述
5.編譯成功后庫的位置
在這里插入圖片描述
在這里插入圖片描述
最后編譯成功后可以丟到/usr/bin里也可以丟到自己的寫的程序的目錄下

源碼

源碼結構如下
在這里插入圖片描述
下面是libeventuse.cpp

#include "libeventuse.h"
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#ifndef _WIN32
#include <netinet/in.h>
# ifdef _XOPEN_SOURCE_EXTENDED
#  include <arpa/inet.h>
# endif
#include <sys/socket.h>
#endif#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>
#include <event2/util.h>
#include <event2/event.h>
#include"qdebug.h"static const char MESSAGE[] = "Hello, World!\n";static const unsigned short PORT = 9995;static void listener_cb(struct evconnlistener *, evutil_socket_t,struct sockaddr *, int socklen, void *);
static void conn_writecb(struct bufferevent *, void *);
static void conn_eventcb(struct bufferevent *, short, void *);
static void signal_cb(evutil_socket_t, short, void *);int main3()
{struct event_base *base;struct evconnlistener *listener;struct event *signal_event;struct sockaddr_in sin = {0};base = event_base_new();//初始化if (!base) {fprintf(stderr, "Could not initialize libevent!\n");return 1;}sin.sin_family = AF_INET;sin.sin_port = htons(PORT);listener = evconnlistener_new_bind(base, listener_cb, (void *)base,LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1,(struct sockaddr*)&sin,sizeof(sin));//事件監聽if (!listener) {fprintf(stderr, "Could not create a listener!\n");return 1;}signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)base);//信號事件if (!signal_event || event_add(signal_event, NULL)<0) {fprintf(stderr, "Could not create/add a signal event!\n");return 1;}event_base_dispatch(base);//啟動evconnlistener_free(listener);event_free(signal_event);event_base_free(base);printf("done\n");return 0;
}static void
listener_cb(struct evconnlistener *listener, evutil_socket_t fd,struct sockaddr *sa, int socklen, void *user_data)
{struct event_base *base = static_cast<event_base*>(user_data);struct bufferevent *bev;bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);if (!bev) {fprintf(stderr, "Error constructing bufferevent!");event_base_loopbreak(base);return;}bufferevent_setcb(bev, NULL, conn_writecb, conn_eventcb, NULL);bufferevent_enable(bev, EV_WRITE);bufferevent_disable(bev, EV_READ);bufferevent_write(bev, MESSAGE, strlen(MESSAGE));
}static void
conn_writecb(struct bufferevent *bev, void *user_data)
{struct evbuffer *output = bufferevent_get_output(bev);if (evbuffer_get_length(output) == 0) {printf("flushed answer\n");bufferevent_free(bev);}
}static void
conn_eventcb(struct bufferevent *bev, short events, void *user_data)
{if (events & BEV_EVENT_EOF) {printf("Connection closed.\n");} else if (events & BEV_EVENT_ERROR) {printf("Got an error on the connection: %s\n",strerror(errno));/*XXX win32*/}/* None of the other events can happen here, since we haven't enabled* timeouts */bufferevent_free(bev);
}static void
signal_cb(evutil_socket_t sig, short events, void *user_data)
{struct event_base *base = static_cast<event_base*>(user_data);struct timeval delay = { 2, 0 };printf("Caught an interrupt signal; exiting cleanly in two seconds.\n");event_base_loopexit(base, &delay);
}
libeventuse::libeventuse()
{main3();
}

下面是mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ui_form.h"
#include"QString"
#include"qdebug.h"
#include"qmessagebox.h"
#include"libeventuse.h"#include <QMutex>
#include <QTime>
#include <QWidget>WorkThread::WorkThread(QObject *parent) : QThread(parent) {}void WorkThread::run() {  // 必須實現 run()
libeventuse tmp;
emit this->server_finish();
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);login_win=new Form;workthread=new WorkThread;login_win->hide();//登錄窗口打開workthread->start();connect(this->workthread,&WorkThread::server_finish,[=](){qDebug()<<"服務器關閉";});connect(this->workthread,&WorkThread::finished,this->workthread,&QObject::deleteLater);connect(this->login_win,&Form::back,[=](){//槽函數this->show();//返回登錄界面this->login_win->hide();//主執行界面關閉});}MainWindow::~MainWindow()
{delete login_win;delete ui;
}Form::Form(QWidget *parent) :QWidget(parent),ui(new Ui::Form)
{ui->setupUi(this);}Form::~Form()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QString RootName=ui->rootName->text();QString Password=ui->password->text();if(RootName.size()==0){QMessageBox::information(this, tr("提示"), tr("用戶名沒有輸入"));return ;}else if(RootName.size()==0){QMessageBox::information(this, tr("提示"), tr("密碼沒有輸入"));}if(RootName=="i"&&Password=="1")//驗證用戶和密碼{qDebug()<<RootName<<Password;login_win->show();//主執行界面打開this->hide();//登錄界面關閉}else{QMessageBox::information(this, tr("提示"), tr("用戶或密碼輸入錯誤"));}}void Form::on_pushButton_clicked()
{emit this->back();//發送信號
}void MainWindow::on_pushButton_2_clicked()
{}

下面是libeventuse.h

#ifndef LIBEVENTUSE_H
#define LIBEVENTUSE_H
class libeventuse
{
public:libeventuse();
};#endif // LIBEVENTUSE_H

下面是mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
namespace Ui {
class Form;
}class Form : public QWidget
{Q_OBJECTpublic:explicit Form(QWidget *parent = 0);~Form();private slots:void on_pushButton_clicked();
signals:void back();
private:Ui::Form *ui;
};#include <QThread>
class WorkThread : public QThread {Q_OBJECT  // 必須添加!!!
public:explicit WorkThread(QObject *parent = nullptr);
protected:void run() override;  // 虛函數聲明
signals:
void WorkThread_signal(int b);//自定義的信號
void server_finish();
};namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();Form* login_win=nullptr;WorkThread*workthread=nullptr;
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H

pro文件的配置
在這里插入圖片描述

演示視頻

20250415_153450

我視頻第一部分展示了如何在qt創建窗口
視頻第二部分展示了客戶端連接到服務器后會接收到hello world
視頻等審核過了我再放上來
審核沒過我就發效果圖
在這里插入圖片描述

qt的一些知識

在這里插入圖片描述
1.信號的格式
signals:
void WorkThread_signal(int b);//自定義的信號
2.注意事項,需要分寫入Q_OBJECT才能這么定義
3.信號發送使用 emit 發送
在這里插入圖片描述
4.使用connect槽函數來綁定信號要處理的邏輯
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76954.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

八、自動化函數

1.元素的定位 web自動化測試的操作核心是能夠找到頁面對應的元素&#xff0c;然后才能對元素進行具體的操作。 常見的元素定位方式非常多&#xff0c;如id,classname,tagname,xpath,cssSelector 常用的主要由cssSelector和xpath 1.1 cssSelector選擇器 選擇器的功能&#x…

Web三漏洞學習(其二:sql注入)

靶場&#xff1a;NSSCTF 、云曦歷年考核題 二、sql注入 NSSCTF 【SWPUCTF 2021 新生賽】easy_sql 這題雖然之前做過&#xff0c;但為了學習sql&#xff0c;整理一下就再寫一次 打開以后是杰哥的界面 注意到html網頁標題的名稱是 “參數是wllm” 那就傳參數值試一試 首先判…

單片機非耦合業務邏輯框架

在小型單片機項目開發初期&#xff0c;由于業務邏輯相對簡單&#xff0c;我們往往較少關注程序架構層面的設計。 然而隨著項目經驗的積累&#xff0c;開發者會逐漸意識到模塊間的耦合問題&#xff1a;當功能迭代時&#xff0c;一處修改可能引發連鎖反應。 此時&#xff0c;構…

Zookeeper三臺服務器三節點集群部署(docker-compose方式)

1. 準備工作 - 服務器:3 臺服務器,IP 地址分別為 `10.10.10.11`、`10.10.10.12`、`10.10.10.13`。 - 安裝 Docker:確保每臺服務器已安裝 Docker 和 Docker Compose。 - 網絡通信:確保三臺服務器之間可以通過 IP 地址互相訪問,并開放以下端口: - `2181`:Zookeeper 客戶…

Mac關閉sip方法

Mac關閉sip方法 導航 文章目錄 Mac關閉sip方法導航完整操作流程圖詳細步驟 完整操作流程圖 這東西是我在網上搬運下來的&#xff0c;但是我在為業務實操過程中&#xff0c;根據實操情況還是有新的注意點的 詳細步驟 1.在「關于本機」-「系統報告」-「軟件」;查看SIP是否開啟…

C++| 深入剖析std::list底層實現:鏈表結構與內存管理機制

引言 std::list的底層實現基于雙向鏈表&#xff0c;其設計哲學與std::vector截然不同。本文將深入探討其節點結構、內存分配策略及迭代器實現原理&#xff0c;揭示鏈表的性能優勢和潛在代價。 1. 底層數據結構&#xff1a;雙向鏈表 每個std::list節點包含&#xff1a; 數據域…

漢諾塔問題——用貪心算法解決

目錄 一&#xff1a;起源 二&#xff1a;問題描述 三&#xff1a;規律 三&#xff1a;解決方案 遞歸算法 四&#xff1a;代碼實現 復雜度分析 一&#xff1a;起源 漢諾塔&#xff08;Tower of Hanoi&#xff09;問題起源于一個印度的古老傳說。在世界中心貝拿勒斯&#…

【Python】Python 100題 分類入門練習題 - 新手友好

Python 100題 分類入門練習題 - 新手友好篇 - 整合篇 一、數學問題題目1&#xff1a;組合數字題目2&#xff1a;利潤計算題目3&#xff1a;完全平方數題目4&#xff1a;日期天數計算題目11&#xff1a;兔子繁殖問題題目18&#xff1a;數列求和題目19&#xff1a;完數判斷題目21…

【linux】--- 進程概念

進程概念 1.認識馮諾依曼結構2. 操作系統&#xff08;Operator system)2.1 概念2.2 設計OS的目的2.3 理解操作系統2.4 如何理解管理2.5 理解系統調用和庫函數 3. 進程3.1 基本概念和基本操作3.1.1 描述進程 - PCB3.1.2 task_struct3.1.3 查看進程 3.2 進程狀態3.2.1 運行&&…

算法堆排序記錄

【算法】排序算法之堆排序 - 知乎 應用場景&#xff1a;獲取第n個大或者小的數 操作步驟&#xff1a; 1、將數組構造成堆 2、調整根節點為最大堆 ->倒序對每個根節點執行最大化 ->根節點最大化過程中如果發生交換&#xff0c;需要保證子節點也為最大堆&#xff08;執行…

STM32 模塊化開發實戰指南:系列介紹

本文是《STM32 模塊化開發實戰指南》系列的導讀篇,旨在介紹整個系列的寫作目的、適用讀者、技術路徑和每一篇的主題規劃。適合從事 STM32、裸機或 RTOS 嵌入式開發的個人開發者、初創工程師或企業項目團隊。 為什么要寫這個系列? 在嵌入式開發中,很多人剛開始都是從點亮一個…

【眼底輔助診斷開放平臺】項目筆記

這是一個標題 任務一前端頁面開發&#xff1a;后端接口配置&#xff1a; 任務二自行部署接入服務 日志修改樣式和解析MD文檔接入服務 Note前端登陸不進去/更改后端api接口304 Not Modifiedlogin.cache.jsonERR_CONNECTION_TIMED_OUT跨域一般提交格式proxy.ts src/coponents 目錄…

【后端開發】Spring MVC-計算器、用戶登錄、留言板

文章目錄 前后端分離設計接口設計思路項目問題解決思路 計算器需求分析接口定義前端頁面代碼服務器代碼 用戶登錄需求分析接口定義用戶登錄校驗接口查詢登錄用戶接口 前端頁面代碼用戶登錄校驗查詢登錄用戶 服務器代碼前后端交互 留言版需求分析接口定義獲取全部留言發布留言前…

在Ubuntu-22.04.5中安裝ONLYOFFICE DocSpace(協作空間)【注意:安裝失敗,謹慎參考!】

1. 通過Docker安裝 預計需要下載10G的鏡像。 &#xff08;1&#xff09;下載docspace安裝腳本 curl -fsSL https://download.onlyoffice.com/docspace/docspace-install.sh -o docspace-install.sh &#xff08;2&#xff09;修改docker compose的別名為docker-compose ali…

2025年計算機領域重大技術突破與行業動態綜述

——前沿技術重塑未來&#xff0c;開發者如何把握機遇&#xff1f; 2025年第一季度&#xff0c;全球計算機領域迎來多項里程碑式進展&#xff0c;從量子計算到人工智能&#xff0c;從芯片設計到網絡安全&#xff0c;技術革新與產業融合持續加速。本文梳理近三個月內最具影響力…

一、LLM 大語言模型初窺:起源、概念與核心原理

一、初識大模型 1.1 人工智能演進與大模型興起:從A11.0到A12.0的變遷 AI 1.0時代&#xff08;2012-2022年&#xff09; 感知智能的突破&#xff1a;以卷積神經網絡&#xff08;CNN&#xff09;為核心&#xff0c;AI在圖像識別、語音處理等感知任務中超越人類水平。例如&#…

Redis 分布式鎖+秒殺異步優化

文章目錄 問題思路setnx實現鎖誤刪問題和解決方案Redis Lua腳本問題引出解決方案 setnx實現的問題Redission快速入門redission可重入鎖原理 秒殺優化(異步優化)異步秒殺思路秒殺資格判斷Redis消息隊列 問題 比如我們兩個機器都部署了我們項目&#xff0c;這里nginx使用輪詢的方…

機器學習中的距離度量與優化方法:從曼哈頓距離到梯度下降

目錄 前言一、曼哈頓距離(Manhattan Distance)&#xff1a;二、切比雪夫距離 (Chebyshev Distance)&#xff1a;三、 閔可夫斯基距離(Minkowski Distance)&#xff1a;小結四、余弦距離(Cosine Distance)五、杰卡德距離(Jaccard Distance)六、交叉驗證方法6.1 HoldOut Cross-v…

HTML 嵌入標簽對比:小眾(<embed>、<object>) 與 <iframe> 的優缺點及使用場景和方式

需求背景 在網頁開發中&#xff0c;嵌入外部資源預覽&#xff08;如視頻、PDF、地圖或其他網頁&#xff09;是常見的需求。HTML 提供了多種標簽來實現這一功能&#xff0c;其中 <embed>、<object> 和 <iframe> 是最常用的三種。本文將對比它們的優缺點&…

未來七軸機器人會占據主流?深度解析具身智能方向當前六軸機器人和七軸機器人的區別,七軸力控機器人發展會加快嗎?

六軸機器人和七軸機器人在設計、功能和應用場景上存在明顯區別。六軸機器人是工業機器人的傳統架構&#xff0c;而七軸機器人則在多自由度和靈活性方面進行了增強。 本文將在理解這兩者的區別以及為何六軸機器人仍然是市場主流&#xff0c;從多個方面進行深入解讀六軸和七軸區…