跳转到帖子

墨香年少

Administrators
  • 帖子数

    309
  • 注册日期

  • 上次访问

  • 得奖次数

    18

最新回复 发布由 墨香年少


  1. 1.安装spawn-fcgi-1.6.5

    wget https://download.lighttpd.net/spawn-fcgi/releases-1.6.x/spawn-fcgi-1.6.5.tar.xz
    tar -xf spawn-fcgi-1.6.5.tar.xz 
    cd spawn-fcgi-1.6.5
    ./configure 
    make
    make install

    2.安装fastcgi++-2.1

    wget http://download.savannah.nongnu.org/releases/fastcgipp/fastcgi++-2.1.tar.bz2
    tar -xf fastcgi++-2.1.tar.bz2 
    cd fastcgi++-2.1
    ./configure --disable-shared --enable-static
    make && make install

    3.安装boost_1_64_0

    wget https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.gz
    tar -zxvf boost_1_64_0.tar.gz
    cd boost_1_64_0
    ./bootstrap.sh
    ./b2 install
    

    编写一个程序测试boost

    #include <string>
    #include <iostream>
    #include <boost/version.hpp>
    #include <boost/config.hpp>
    
    using namespace std;
    
    int main()
    {
        cout << BOOST_VERSION << endl;    //Boost版本号
        cout << BOOST_LIB_VERSION << endl;   //Boost版本号
        cout << BOOST_PLATFORM << endl;    //操作系统
        cout << BOOST_COMPILER << endl;    //编译器
        cout << BOOST_STDLIB << endl;         //标准库
    }

    编译

    g++ test_boost.cpp  -o test_boost

    成功会出现如下界面

    test_boost.png

     

    接下来,写一个cgi文件来测试cgi环境是不是生效

    文件名称为main.cpp,代码如下:

    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <fstream>
    #include <fastcgi++/request.hpp>
    #include <fastcgi++/manager.hpp>
    void error_log(const char* msg)
    {
       using namespace std;
       using namespace boost;
       static ofstream error;
       if(!error.is_open())
       {
          error.open("/tmp/errlog", ios_base::out | ios_base::app);
          error.imbue(locale(error.getloc(), new posix_time::time_facet()));
       }
       error << '[' << posix_time::second_clock::local_time() << "] " << msg << endl;
    }
    class HelloWorld: public Fastcgipp::Request<wchar_t>
    {
       bool response()
       {
          out << "Content-Type: text/html; charset=utf-8\r\n\r\n";
          out << "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' />";
          out << "<title>fastcgi++: Hello World in UTF-8</title></head><body>";
          out << "<h2>this is a test fastcgi demo</h2>";
    	  out << "</body></html>";
          err << "Hello apache error log";
          return true;
       }
    };
    int main()
    {
       try
       {
          Fastcgipp::Manager<HelloWorld> fcgi;
          fcgi.handler();
       }
       catch(std::exception& e)
       {
          error_log(e.what());
       }
    }

    使用如下命令:

    g++ main.cpp -o main -I/server/cgi/include -L/server/cgi/lib  -lfastcgipp -lboost_system -lboost_thread -lpthread

    生成了main文件后,配置nginx

    nginx.png

    使用浏览器查看cgi

    cgi.png


  2. #include <stdio.h>   
    #include <stdlib.h>   
    #include <unistd.h>   
    #include <fcntl.h>   
    #include <limits.h>   
    #include <sys/types.h>   
    #include <sys/wait.h>   
     
    #define BUFSZ 150   
     
    void err_quit(char *msg);
    
    int main(int argc, char *argv[])
    {   
    	
    	FILE* fp;
    	int count;
    	char buf[BUFSZ];   
    	char command[150];   
    
    	sprintf(command, "ps -ef | grep MainServer | grep -v grep | wc -l" );
    	
    	while(1)
    	{
    		if((fp = popen(command,"r")) == NULL)
    		{
    			err_quit("popen");
    		}
    		if( (fgets(buf,BUFSZ,fp))!= NULL ) 
    		{ 
    			count = atoi(buf);   
    			if(count  == 0)
    			{
    				//进程不存在,需要启动
    				system("/server/mainserver/MainServer &");
    				printf("已经重新拉起!\n");
    			}
    			else
    			{
    				//进程存在
    				printf("进程存在\n");
    			}
    		}
    		
    		usleep(1000000); //1秒
    	}
    
    	pclose(fp);   
    	return EXIT_SUCCESS;
    }
    
    void err_quit(char *msg)
    {
    
    	perror(msg);   
    	exit(EXIT_FAILURE);   
    }

    附上守护进程代码:

    void set_daemon(){
    	int ret_code = fork();
    	if (ret_code < 0){
    		exit(1);
    	}else if (ret_code>0){
    		exit(0);
    	}
    	setsid();
    	ret_code = fork();
    	if (ret_code < 0){
    		exit(1);
    	}else if (ret_code>0){
    		exit(0);
    	}
    	chdir(".");
    	umask(0);
    	for(int fd = 0;fd< getdtablesize();fd++){
    		close(fd);
    	}
    }
    
    int main(int argc, char *argv[])
    {
        set_daemon();
        return 0;
    }

     


  3. 
    std::string UrlEncode(const std::string& szToEncode)
    {
    	std::string src = szToEncode;
    	char hex[] = "0123456789ABCDEF";
    	string dst;
    
    
    	for (size_t i = 0; i < src.size(); ++i)
    	{
    		unsigned char cc = src[i];
    		if ( cc >= 'A' && cc <= 'Z' 
                     || cc >='a' && cc <= 'z'
                     || cc >='0' && cc <= '9'
                     || cc == '.'
                     || cc == '_'
                     || cc == '-'
                     || cc == '*')
    		{
    			if (cc == ' ')
    			{
    				dst += "+";
    			}
    			else
    				dst += cc;
    		}
    		else
    		{
    			unsigned char c = static_cast<unsigned char>(src[i]);
    			dst += '%';
    			dst += hex[c / 16];
    			dst += hex[c % 16];
    		}
    	}
    	return dst;
    }
    
    
    std::string UrlDecode(const std::string& szToDecode)
    {
    	std::string result;
    	int hex = 0;
    	for (size_t i = 0; i < szToDecode.length(); ++i)
    	{
    		switch (szToDecode[i])
    		{
    		case '+':
    			result += ' ';
    			break;
    		case '%':
    			if (isxdigit(szToDecode[i + 1]) && isxdigit(szToDecode[i + 2]))
    			{
    				std::string hexStr = szToDecode.substr(i + 1, 2);
    				hex = strtol(hexStr.c_str(), 0, 16);
    				//字母和数字[0-9a-zA-Z]、一些特殊符号[$-_.+!*'(),] 、以及某些保留字[$&+,/:;=?@]
    				//可以不经过编码直接用于URL
    				if (!((hex >= 48 && hex <= 57) ||	//0-9
    					(hex >=97 && hex <= 122) ||	//a-z
    					(hex >=65 && hex <= 90) ||	//A-Z
    					//一些特殊符号及保留字[$-_.+!*'(),]  [$&+,/:;=?@]
    					hex == 0x21 || hex == 0x24 || hex == 0x26 || hex == 0x27 || hex == 0x28 || hex == 0x29
    					|| hex == 0x2a || hex == 0x2b|| hex == 0x2c || hex == 0x2d || hex == 0x2e || hex == 0x2f
    					|| hex == 0x3A || hex == 0x3B|| hex == 0x3D || hex == 0x3f || hex == 0x40 || hex == 0x5f
    					))
    				{
    					result += char(hex);
    					i += 2;
    				}
    				else result += '%';
    			}else {
    				result += '%';
    			}
    			break;
    		default:
    			result += szToDecode[i];
    			break;
    		}
    	}
    	return result;
    }

     


  4. //自行包含相关代码
    void set_daemon(){
    	int ret_code = fork();
    	if (ret_code < 0){
    		exit(1);
    	}else if (ret_code>0){
    		exit(0);
    	}
    	setsid();
    	ret_code = fork();
    	if (ret_code < 0){
    		exit(1);
    	}else if (ret_code>0){
    		exit(0);
    	}
    	chdir("."); //一定要切换到当前目录
    	umask(0);
    	for(int fd = 0;fd< getdtablesize();fd++){
    		close(fd);
    	}
    }
    
    int main(int argc, char *argv[])
    {
        set_daemon();
        /*
        自己的业务代码
        */
        return 0;
    }

     


  5. 使用Ant Design的上传组件提示strict-origin-when-cross-origin跨域的解决方案

    一句话:设置headers={{"X-Requested-With":null}}

    <Upload
      headers={{"X-Requested-With":null}}
      action={file_api}
      listType="picture-card"
      fileList={this.state.thumbs}
      onPreview={this.handlePreview}
      onChange={this.handleChange}
    >
        <div><PlusOutlined /><div style={{marginTop: 8,}}>选择文件</div></div>
    </Upload>

     


  6. 在《家有儿女》中,夏东海收到了一笔稿费 10000 元,让 3 个儿女提要求:小雪要租服务器,一年 10000;刘星要笔记本电脑,8000;小雨要带滑梯的床,6000。

    看到这里,我真的很想问:

    什么样的家庭,会在 2004 年的时候,收到一笔 10000 的稿费,当下就决定全部花掉?

    什么样的家庭,会在 2004 年的时候,让几岁和十几岁的孩子,可以放心提出买一个成千上万块的物品的要求?

    至少一定是家里都置办全了,且经济上无借债,生活水平相对富裕,且收入可观或稳定的家庭。

    重看《家有儿女》,发现了好多细节,都印证了我的想法。

    刘梅梳妆台上的化妆品,是资生堂、纪梵希、雅诗兰黛,这些牌子,就是搁现在,也不便宜啊。

    刘星买运动鞋,动不动就是耐克或者阿迪,好几次都提到鞋子要 800 甚至 1000 多一双。当时的我连美特斯邦威都买不起。

    要知道,这家里可有是 3 个孩子啊,一个孩子的话费都得乘以 3 才行。

    家里冰箱常备各种饮料和冰淇淋:芬达、健力宝、高乐高、哈根达斯,就跟超市似的,随开随有。

    夏东海的衣服也从来不重样,有次还穿了件 tommy hilfiger,3000 元一件。

    刘梅和小雪喜欢吃榴莲,还说要每周都吃。说实在的,2004 年的时候,很多人都不知道榴莲长啥样吧。

    一家人吃饭,顿顿四五个菜,多的时候八九个菜,还都是油焖大虾、红烧排骨、香辣蟹之类的,反正什么贵就吃什么,没错的。

    人家每次吃水果,每块水果上都插了一根牙签。而我家吃水果,两根牙签吃一盘子水果,我再多拿一根,我妈都打我。

    三个小孩每次出去吃饭都要求吃烤鸭,因为 kfc 之类的快餐早就吃腻了。

    刘梅有次出国一周,给了夏东海 2000 块钱生活费让他负责全家一周开销。

    2000 块一周,我都觉得太高了这标准,没想到人家夏东海 4 天就吃完了。

    夏东海日常使用的剃须刀是进口的,刘梅的天天喷的香水是进口的,关键是刘梅还老去国外出差,有一次是去的还是希腊。

    刘梅一家不仅物质生活丰裕,精神享受也不能少,他们经常去看个电影,看个魔术现场表演,听个音乐会。业余生活非常丰富。

    2004 年看《家有儿女》的时候,就相当羡慕刘星一家,觉得他家真有钱啊。

    现在再看的时候,依旧是个羡慕,他家真有钱啊。


  7. 下面的代码是我用Qt加载JsPrinterDll.dll的代码

    .h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QLibrary>
    #include <QMainWindow>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    //出票机dll方法
    typedef int (_stdcall *puniOpenUsb)();
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
        //初始化出票机
        void init_printer();
    
    private:
        Ui::MainWindow *ui;
    
        //出票机相关方法
        bool PrintDllLoad = false; //加载状态
        int printConnect = 0; //连接状态
        puniOpenUsb uniOpenUsb = NULL;
    };
    #endif // MAINWINDOW_H

    .cpp

    #pragma execution_character_set("utf-8")
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QMessageBox>
    #include <QDebug>
    #include "Windows.h"
    
    MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        this->setStyleSheet("font-family: \"Microsoft Yahei\";");
    
        //初始化出票机
        this->init_printer();
    }
    
    //初始化出票机
    void MainWindow::init_printer()
    {
        HINSTANCE JsPrinterDll = LoadLibraryA("JsPrinterDll");
        if(JsPrinterDll)
        {
            qDebug() << "出票机dll加载......OK";
            PrintDllLoad = true;
    
            uniOpenUsb = (puniOpenUsb)GetProcAddress(JsPrinterDll, "uniOpenUsb");
    
            printConnect = uniOpenUsb();
            if(printConnect >= 1)
            {
                qDebug() << "出票机连接......OK";
            }
            else
            {
                qDebug() << "出票机连接失败!状态码:" << printConnect;
            }
        }
        else
        {
            PrintDllLoad = false;
            uniOpenUsb = NULL;
            printConnect = 0;
        }
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }

    输出:

    出票机dll加载......OK
    出票机连接......OK

     


  8. 新建一个cmd的快捷方式

    C:\Windows\System32\cmd.exe /A /Q /K D:\QT5\5.15.2\msvc2019\bin\qtenv2.bat

    因为我的是32位的,所以直接链接的32位的bat

    打开这个cmd,输入命令:

    D:\QT5\5.15.2\msvc2019\bin\windeployqt.exe D:\DISK\build-DiskClient-Desktop_Qt_5_15_2_MSVC2019_32bit-Release\release\DiskClient.exe

    适当调整你的位置,确保exe都是存在的。这样命令后,exe可以直接打开。

    如果你有第三方的库,自行把第三方的dll拷贝过去


  9. // index.js
    // 获取应用实例
    const app = getApp()
    
    Page({
        data: {
            tip:"",
            wifissid:"",
            wifibssid:"",
        },
        onLoad() {
            this.checkWiFi()
        },
    
        //检测当前wifi
        checkWiFi()
        {
            let that = this
            wx.getConnectedWifi({
                success: function (e) {
                    that.setData({
                        wifissid: e.wifi.SSID,
                        wifibssid:e.wifi.BSSID,
                    })
                },
                fail: function (e) {
                    that.setData({
                        tip: "wifi获取失败"
                    })
                }
            })
        }
    })

     


  10. 1、QJsonObject转QString

    QString str = QString(QJsonDocument doc(jsonObject).toJson(QJsonDocument::Indented));

    2、QString转QJsonObject

    QString str = "...";
    QJsonObject obj = QJsonDocument::fromJson(str.toUtf8()).object();

    3、QJsonArray转QString

    QString str = QJsonDocument(arr).toJson(QJsonDocument::Compact).constData();

    4、QString转QJsonArray

    QJsonArray arry = QJsonDocument::fromJson(str.toUtf8()).array();

     


  11. 这是我最后的配置命令

    configure.bat -confirm-license -opensource -platform win32-msvc -mp -debug-and-release -static -prefix "D:\QT5_STATIC_SSL"  -sql-mysql -openssl-linked   -qt-sqlite -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -qt-pcre -qt-harfbuzz -no-qml-debug -no-angle -nomake tests -nomake examples -skip wayland -skip qtwebengine -I "D:\QT5\openssl\include" -L "D:\QT5\openssl\lib" -I "D:\MySQL\55\include" -L "D:\MySQL\55\lib"

     


  12. 下载openssl,https://www.openssl.org/source/openssl-1.1.1o.tar.gz

    使用x86 Native Tools Command Prompt for VS 2019进入openssl源码目录

    输入命令:perl Configure VC-WIN32 no-asm --prefix=D:\QT5\openssl

    执行:nmake

    执行nmake install

    重新解压Qt源码包,重新编译一次

    configure.bat -static -prefix "D:\QT5_STATIC_SSL" -confirm-license -opensource  -debug-and-release -platform win32-msvc  -nomake examples -nomake tests  -plugin-sql-mysql -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -mp -ssl -openssl-linked OPENSSL_PREFIX=D:\QT5\openssl

    这样,这次的静态编译就得到了支持ssl的静态Qt


  13. 本来一直以来,一些小工具,我都是用c#来写的,昨天用c#操作mysql一直出问题,貌似我的connection不可以重复使用,google了下也没找到解决方案,于是我退而求其次,看看c#怎么操作mysql的,结果也都是一些玩具一样的代码,于是怒从心头起,恶向胆边生,索性静态编译下Qt去开发以后这些小工具。

     

    于是昨天晚上十点,我输入了nmake后敲了回车,于是凌晨1点我还在等,后来困得不行就睡了。早上起来又敲的nmake install,到了公司后又配置的KIT,写了一个小程序,测试成功。

    这里有一点需要注意的是,静态编译无法动态载入链接库,所以,在nmake之前,必须确保想要的库是yes状态,

     

    下面是我的静态编译过程,没啥不一样的,就是按照网上的教程一步步来就成功了。

    下载:qt-everywhere-src-5.15.2.zip, 大小:962 MB (1,009,224,272 字节) 下载地址:https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.zip

    新建一个文件夹用来存放静态编译后的Qt,比如:D:\QT5_STATIC

    我编译的是32位的MSVC版本的Qt

    首先,在开始菜单中,搜索:x86 Native Tools Command Prompt for VS 2019,打开,进入src目录

    选择mvsc工具.jpg

     

    cmd_enter_src.jpg

     

    安装perl

    我安装的是:strawberry-perl-5.32.1.1-32bit.msi,下载地址是:https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-32bit.msi

    perl_version.png

     

    安装python,我安装的是python-2.7.8.msi,下载地址是:https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi

    python_version.png

     

    修改:D:\QT5\qt-everywhere-src-5.15.2\qtbase\mkspecs\common\msvc-desktop.conf

    msvc_desktop.conf.png

    QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MD
    QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD
    QMAKE_CFLAGS_DEBUG      = -Zi -MDd

    修改为:

    QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MT
    QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MT
    QMAKE_CFLAGS_DEBUG      = -Zi -MTd

    在刚才的 x86 Native Tools Command Prompt for VS 2019 工具里输入:

    configure.bat -static -prefix "D:\QT5_STATIC" -confirm-license -opensource  -debug-and-release -platform win32-msvc  -nomake examples -nomake tests  -plugin-sql-mysql -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -mp

    然后输入:

    nmake

    这个可能需要1-4个小时不等

    成功后输入:

    nmake install

    完成后就成功了,接下来就是QtCreator配置kit了


  14. public Form1()
            {
                InitializeComponent();
                StopProcess();
                set_date();
            }
            //防止多开,保证只有一个exe在运行
            private void StopProcess()
            {
                Process current = Process.GetCurrentProcess();
                Process[] pp = Process.GetProcessesByName(current.ProcessName);
                foreach (Process p in pp)
                {
                    if (p.Id != current.Id)
                    {
                        if (p.MainModule.FileName == current.MainModule.FileName)
                        {
                            p.Kill();
                            return;
                        }
                    }
                }
            }

     


  15. 在做一个Qt的项目的时候,需要本地存储一些数据,本来第一选择是sqlite的,但是我读取的时候,发现同样的sql,Qt读取的结果和navicat读取的结果不一样。

    也没找到为什么不一样,研究再三没有找到原因,于是放弃了sqlite,转而使用mysql

    结果提示我:“QSqlDatabase: QMYSQL driver not loaded”

    首先打印出来支持的数据模块:

    qDebug() << QSqlDatabase::drivers();

    结果中并没有mysql,于是百度和谷歌都去搜索了下,谷歌还专门用英文去搜索了下,发现大部分的网站抄来抄去的解决方案是复制mysql下的dll到qt的对应的目录下,

    我试了下,没有任何作用,错误提示依旧

    于是再找,终于找到了一个网页的方案,并且测试成功了。

    解决方案如下。

    首先,Qt安装的时候需要选中源码,这样才会再Qt的目录下有src目录。我的Qt在D盘下面,所以我的src目录是:

    D:\QT5\5.15.2\Src

    打开下面这个目录:

    D:\QT5\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql

    类似如下:

    1.png

     

    双击:mysql.pro,Qt会自动打开这个项目。

    编辑pro文件,编辑后的代码如下:

    TARGET = qsqlmysql
    
    HEADERS += $$PWD/qsql_mysql_p.h
    SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
    
    #QMAKE_USE += mysql
    
    OTHER_FILES += mysql.json
    
    PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
    include(../qsqldriverbase.pri)
    
    
    # mysql安装目录下的include文件夹
    INCLUDEPATH += "D:/MySQL/55/include"
    
    # mysql安装目录下的lib文件夹下的libmysql.lib文件
    LIBS += "D:/MySQL/55/lib/libmysql.lib"
    
    # 编译后的dll存放的位置
    DESTDIR = "D:\QT5\5.15.2\MysqlDll"

    2.png

     

    3.png

     

    然后编辑,然后去D:\QT5\5.15.2\MysqlDll看下

    结果如下:

    4.png

     

    复制这个文件夹下所有的文件到:

    D:\QT5\5.15.2\msvc2019\plugins\sqldrivers

    5.png

     

    我用的是msvc2019_32 所以拷贝到这个目录,如果你说64位,可能需要复制到:msvc2019_64,mingw的话就复制到:mingw81_32或者mingw81_64

     

    重启Qt后,就没问题了。

    下面是我的单例DB

    #pragma execution_character_set("utf-8")
    #include "db.h"
    
    #include <QCoreApplication>
    #include <QMutex>
    #include <QDebug>
    #include <QMessageBox>
    
    Db::Db(QObject *parent) : QObject(parent)
    {
        qDebug() << QSqlDatabase::drivers();
    
        db = QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("127.0.0.1");
        db.setUserName("root");
        db.setPassword("123456");
        db.setDatabaseName("disk");
    
        if (!db.open())
        {
            QString err = "Error: Failed to connect database.";
            QMessageBox msgBox;
            msgBox.setText(err);
            msgBox.exec();
        }
    }
    
    Db *Db::Instance()
    {
        static QMutex mutex;
        static QScopedPointer<Db> inst;
        if (Q_UNLIKELY(!inst)) {
            mutex.lock();
            if (!inst) {
                inst.reset(new Db);
            }
            mutex.unlock();
        }
        return inst.data();
    }
    
    bool Db::isOpen()
    {
        if (!db.open())//判断数据库是否打开
        {
            qDebug() << "db open faild! err:" << db.lastError();
            return false;
        }
        qDebug() << "数据库打开成功";
        return true;
    }
    
    void Db::query(QString sql)
    {
        QSqlQuery sql_query;
        sql_query.exec(sql);
    }

    最后输出如下:

    ("QSQLITE", "QMARIADB", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
    数据库打开成功

    -- 结束 --


  16. qDebug() << "QSslSocket::sslLibraryBuildVersionString()" << QSslSocket::sslLibraryBuildVersionString();
    qDebug() << "QSslSocket::sslLibraryVersionString()" << QSslSocket::sslLibraryVersionString();
    qDebug() << "Supports SSL: " << QSslSocket::supportsSsl();

     

×
×
  • 创建新的...

重要信息

注册必须使用2-8个中文汉字作为账号