這裡以生成客戶端證書和金鑰檔案為例,目的是建立乙個加密的安全的tcp連線
1 生成金鑰檔案
命令:openssl genrsa -des3 -out pk.pem 2048
會提示輸入金鑰短語,輸入後還會讓輸入確認
2 生成證書檔案
openssl req -new -x509 -key pk.pem -out ca.pem -days 365
驗證**片段:
// logout
#include #include "openssl/ossl_typ.h"
#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
#include "kksock.h"
#pragma comment (lib,"ws2_32.lib")
#pragma comment( lib, "openssl/lib/libeay32.lib" )
#pragma comment( lib, "openssl/lib/ssleay32.lib" )
class csslclient
;
// **裡的ckksock為乙個封裝的select模型的類,也可以使用原生的socket,執行阻塞或非阻塞操作
#include "sslclient.h"#include #include using namespace std;
csslclient::csslclient()
csslclient::~csslclient()
void csslclient::reset()
if(m_pctx)
m_tcpsocket.close();
} void csslclient::initssl()
bool csslclient::doconnect()
; if (getmodulefilename(null, szpath, max_path) == 0)
for (int i = strlen(szpath); i > 0; i--)
}char szcapath[max_path + 1] = ;
char szpkpath[max_path + 1] = ;
strcpy(szcapath, szpath);
strcpy(szpkpath, szpath);
strcat(szcapath, "\\ca.pem");
strcat(szpkpath, "\\pk.pem");
if (!ssl_ctx_use_certificate_file(m_pctx, szcapath, ssl_filetype_pem))
break;
// 驗證密碼檔案
bio* pkeybuff = bio_new_file(szpkpath, "r");
if(null == pkeybuff)
//ssl_ctx_set_default_passwd_cb_userdata
char szpwd[16] = "111111";
evp_pkey *pkey = pem_read_bio_privatekey(pkeybuff, null, null, szpwd);
if(pkey==null)
int nrettmp = ssl_ctx_use_privatekey(m_pctx, pkey);
if (nrettmp <= 0)
bool bconnect = m_tcpsocket.connectex("10.1.8.26", 10156, 3000);
if (!bconnect)
break;
/* an ssl structure is created */
m_pssl = ssl_new(m_pctx);
if(!m_pssl)
if(ssl_get_verify_result(m_pssl) != x509_v_ok)
/* assign the socket into the ssl structure (ssl and socket without bio) */
ssl_set_fd(m_pssl, m_tcpsocket.m_sock);
ssl_set_mode(m_pssl, ssl_mode_auto_retry);
/* perform ssl handshake on the ssl client */
dword dwnow = gettickcount();
while ((nrettmp = ssl_connect(m_pssl)) <= 0)
; err_error_string(err_get_error(), szerrmsg);
printf("err msg: %s\n", szerrmsg);
printf("lasterr: %d \n", nlasterr);
break;
}sleep(10);
} printf("nrettmp = %d\n", nrettmp); //if nrettmp > 0 means connect success
bret = true;
char szreadbuffer[2048] = ;
while (true)
; err_error_string(err_get_error(), szerrmsg);
printf("err msg: %s\n", szerrmsg);
int nlasterr = ssl_get_error(m_pssl, nrettmp);
if (nlasterr != ssl_error_want_read && nlasterr != ssl_error_want_write)
}else
sleep(100);
} } while (false);
return bret;
}
Python 自定義生成器
在python中,一邊迴圈一邊計算的機制,稱為生成器 generator 通過yeild 表示式定義生成器 yield一次返回乙個結果,並且會凍結當前函式的狀態 def my gen yield 1 yield 2 yield 3next函式可以迭代生成器的返回值 生成器其實也是迭代器也是可迭代物件...
vs工程 生成事件 自定義生成步驟
cocos2dx 的 win32 工程,會自動把 resources 目錄下的內容拷貝到 debug.win32 目錄下 這樣一來在除錯 尤其是除錯指令碼時就不太方便。想取消這一步驟的話,可以在工程右鍵 自定義生成步驟 命令列 裡面做修改。原本的內容是 if not exist outdir mkd...
自定義生產省略號
overflow hidden text overflow ellipsis display webkit box webkit line clamp 2 webkit box orient vertical 解析 webkit line clamp 限制在乙個塊元素顯示的文字的行數。為了實現該效果...