为编程爱好者分享易语言教程源码的资源网

网站首页 > 易语言相关 > 易语言模块源码 正文

易语言SSL_Socket通信模块源码

三叶资源网 2018-03-30 18:00:46 易语言模块源码 7646 ℃ 28 评论

资源介绍:

模块里有类_客户端_SSL,类_服务端_SSL,KernelFunc,类_许可区,类_网络环境_SSL

资源作者:

易语言入门教程学习

资源界面:

.版本 2

.程序集 类_客户端_SSL, , 公开
.程序集变量 hSocket
.程序集变量 m_ServSockAddr, sockaddr
.程序集变量 CTX
.程序集变量 hSSL, 整数型
.程序集变量 m_ClientCert, 文本型
.程序集变量 m_ClientKey, 文本型
.程序集变量 Bak_ClientStruct, t_ClientStruct

.子程序 _初始化

' 本源码来自三叶资源网(www.sanye.cx)
类_客户端_SSL.设置证书文件 (“ClientCert.pem”, “ClientKey.pem”)

.子程序 _销毁

类_客户端_SSL.断开连接 ()

.子程序 设置证书文件, , 公开
.参数 客户证书, 文本型, , ClientCert.pem
.参数 客户私钥, 文本型, , ClientKey.pem

m_ClientCert = 客户证书
m_ClientKey = 客户私钥

.子程序 连接, 逻辑型, 公开
.参数 目标地址, 文本型
.参数 端口, 短整数型
.参数 通知函数, 子程序指针, , [必须有1个参数=消息类型]
.参数 超时时间, , 可空
.参数 立即SSL连接, 逻辑型, 可空, [默认不用管,代理连接时需要]
.局部变量 fd_read, fd_set
.局部变量 fd_write, fd_set
.局部变量 返回值, 整数型
.局部变量 meth, 整数型

.如果真 (目标地址 = “” 或 端口 = 0)
    返回 (假)
.如果真结束
meth = TLSv1_client_method ()  ' 放在第一句可以让DLL初始化..
类_客户端_SSL.断开连接 ()
CTX = cdeclCall (ProcAddr (“SSL_CTX_new”), meth)
.如果真 (LoadCRTFile (CTX, m_ClientCert, m_ClientKey) = 假)
    类_客户端_SSL.断开连接 ()
    返回 (假)
.如果真结束
Bak_ClientStruct.NotifyProc = 到数值 (通知函数)
Bak_ClientStruct.hSocket = _socket (#AF_INET, #套接类型_Stream, #协议_TCP)
.如果真 (Bak_ClientStruct.hSocket = #SOCKET_ERROR)
    返回 (假)
.如果真结束
_setsockopt (Bak_ClientStruct.hSocket, #SOL_SOCKET, #SO_RcvBuf, 0, 4)  ' 设置读取缓存大小为0
_setsockopt (Bak_ClientStruct.hSocket, #SOL_SOCKET, #SO_SndBuf, 0, 4)  ' 设置写入缓存大小为0
m_ServSockAddr.sin_family = #AF_INET
m_ServSockAddr.sin_port = _ntohs (端口)
m_ServSockAddr.sin_addr = GetNetAddrName (目标地址)
.如果真 (是否为空 (超时时间))
    超时时间 = 3000
.如果真结束
_ioctlsocket (Bak_ClientStruct.hSocket, #FIONBIO, 1)
_connect (Bak_ClientStruct.hSocket, m_ServSockAddr, #SizeOf_sockaddr)
fd_write.fd_count = 1
fd_write.fd_array = Bak_ClientStruct.hSocket
.如果 (超时时间 = -1)
    返回值 = _select_Forever (0, fd_read, fd_write, 0, 0)
.否则
    返回值 = _select (0, fd_read, fd_write, 0, 辅_GetTimeOut (超时时间))
.如果结束
_ioctlsocket (Bak_ClientStruct.hSocket, #FIONBIO, 0)
.如果真 (返回值 ≤ 0)
    _closesocket (Bak_ClientStruct.hSocket)
    返回 (假)
.如果真结束
hSocket = Bak_ClientStruct.hSocket
.如果真 (是否为空 (立即SSL连接) = 真 或 立即SSL连接 = 真)
    .如果真 (建立SSL连接 () = 假)
        类_客户端_SSL.断开连接 ()
        返回 (假)
    .如果真结束

.如果真结束
返回 (真)

.子程序 取Socket句柄, 整数型, 公开, [使用代理协商时用到]

返回 (hSocket)

.子程序 建立SSL连接, 逻辑型, 公开, [使用代理之后必须用到]
.局部变量 ptr, 整数型

' SSl==
Bak_ClientStruct.hSSL = cdeclCall (ProcAddr (“SSL_new”), CTX)
hSSL = Bak_ClientStruct.hSSL
.如果真 (hSSL = 0)
    返回 (假)
.如果真结束
cdeclCall (ProcAddr (“SSL_set_fd”), hSSL, hSocket)
.如果真 (cdeclCall (ProcAddr (“SSL_connect”), hSSL) = #SSL_ERROR)
    返回 (假)
.如果真结束
' ===
ptr = _GlobalAlloc (0, #SizeOf_ClientStruct)
CopyFromClientStruct (ptr, Bak_ClientStruct, #SizeOf_ClientStruct)
_CreateThread (0, 0, &线程_客户端_事件获取, ptr, 0, 0)
返回 (真)

.子程序 断开连接, , 公开

.如果真 (hSSL ≠ 0)
    cdeclCall (ProcAddr (“SSL_shutdown”), hSSL)
    cdeclCall (ProcAddr (“SSL_free”), hSSL)
    hSSL = 0
.如果真结束
.如果真 (hSocket ≠ 0)
    _shutdown (hSocket, #SD_BOTH)
    _closesocket (hSocket)
    hSocket = 0
.如果真结束
.如果真 (CTX ≠ 0)
    cdeclCall (ProcAddr (“SSL_CTX_free”), CTX)
    CTX = 0
.如果真结束
m_ServSockAddr.sin_port = 0
m_ServSockAddr.sin_addr = 0

.子程序 取服务器IP, 文本型, 公开

返回 (_inet_ntoa (m_ServSockAddr.sin_addr))

.子程序 发送数据, 整数型, 公开, 返回发送成功长度[有些对方的缓存大小是有限制的]
.参数 数据, 字节集
.局部变量 返回值

.如果真 (hSSL = 0)
    返回 (-1)
.如果真结束
.如果真 (数据 = {  })
    返回 (0)
.如果真结束
' 返回值 = _send (hSocket, 数据, 取字节集长度 (数据), 0)
返回值 = cdeclCall (ProcAddr (“SSL_write”), hSSL, Ptr_Bin (数据), 取字节集长度 (数据), 0)
返回 (返回值)

.子程序 取回数据, 字节集, 公开
.参数 通知参数值
.局部变量 ClientStruct, t_ClientStruct

.如果真 (通知参数值 = 0)
    返回 ({  })
.如果真结束
CopyToClientStruct (ClientStruct, 通知参数值, #SizeOf_ClientStruct)
返回 (指针到字节集 (ClientStruct.DataParam, _GlobalSize (ClientStruct.DataParam)))

.子程序 取消息类型, 整数型, 公开
.参数 通知参数值
.局部变量 ClientStruct, t_ClientStruct

.如果真 (通知参数值 = 0)
    返回 (-1)
.如果真结束
CopyToClientStruct (ClientStruct, 通知参数值, #SizeOf_ClientStruct)
返回 (ClientStruct.MsgType)


.子程序 标记参数是否正确, 逻辑型, 公开, [没有类似[取事件组件()]的命令,所以用这个来代替]
.参数 通知参数值
.局部变量 ClientStructStruct, t_ClientStruct

.如果真 (通知参数值 = 0 或 hSocket = 0)
    返回 (假)
.如果真结束
CopyToClientStruct (ClientStructStruct, 通知参数值, #SizeOf_ClientStruct)
返回 (ClientStructStruct.hSocket = hSocket)

资源下载:

文件下载

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

已有28位网友发表了看法:

  • 自学网

    自学网  评论于 [2019-05-30 15:15:47]  回复

    易语言获取socke+port

  • 三叶网

    三叶网  评论于 [2019-11-02 22:56:17]  回复

    易语言+closesocket

  • 易语言

    易语言  评论于 [2020-05-27 23:45:31]  回复

    易语言网络通信模块

  • 按钮

    按钮  评论于 [2020-06-05 23:43:37]  回复

    易语言+socket+模块

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
模仿精易的窗口探测咪咕音乐微信网页版协议抖音快递查询纯组件美化界面UI视频解析斗鱼弹幕助手二维数组同程APP超级列表框POST登陆财付通腾讯迅雷Aplayer引擎hpsocketQQ源码鱼刺通用架构快递批量查询源码RAPIDXMLUDP组播
最新评论