使用socket封装库-waisock编程入门

来源:互联网 发布:线程优化 编辑:程序博客网 时间:2024/05/20 08:25

一、简介

    waisock是一款优秀的socket封装库,其提供了C语言的API接口,并且可以在常见的Windows、Linux、AIX、HP-UX、Solaris等操作系统上运行。


二、编程例子

waisock发布包中自带了三个waisock使用的例子,其中:

(1)01waissldemo目录中包含的是SSL通信的例子程序。

(2)02waimonagent目录中包含的是使用TCP服务端的例子,其演示的是作为一个后台监控代理的功能。

(3)03WaiMonTerm目录中包含的是使用TCP客户端的例子,其演示的是作为一个监控终端的功能,并且能与MFC集成到一起使用。该程序连接的是02waimonagent的服务端。

以上三个程序,都是waisock库使用的例子。在需要使用到监控的场合,以上程序甚至可以拿来直接使用,可以节省大量的工作量。

言归正传,waisock库到底怎么使用呢?我们先参考02waimonagent目录下的例子来介绍。主程序代码不长,在waimonagent.cpp中,总共不到100行源码,核心代码如下:

STUWaiSockParam oSockParam;oSockParam.m_pUserPtr = g_pRunApp;oSockParam.m_iTimerMillSecond = 1000;oSockParam.m_iMaxSockConnFailSecond = 5;oSockParam.m_iMaxPossiblePkgLength = 100*1024*1024;oSockParam.m_iSendHBIntervalSecond = 5;oSockParam.m_iRecvTimeoutSecond = 12;oSockParam.m_i64OneLinkMaxSendMemLimitMB = 200;oSockParam.m_i64AllLinkMaxSendMemLimitMB = 800;oSockParam.OnGetOnePkgLen = OnMonGetOnePkgLen;oSockParam.OnCreateHBPkg = OnMonCreateHBPkg;oSockParam.OnLinkDown = OnMonLinkDown;oSockParam.OnReceivePkg = OnMonRecvdPkg;oSockParam.OnConningFailed = OnMonConningFailed;oSockParam.OnConningOK = OnMonConningOK;oSockParam.OnAcceptNew = OnMonAcceptNew;oSockParam.OnSSLConnectAcceptFailed = OnMonSSLConnectAcceptFailed;oSockParam.OnSSLCheckRemoteCertInfo = OnMonSSLCheckRemoteCertInfo;oSockParam.OnLicenseError = OnMonLicenseError;oSockParam.OnTimer = OnMonTimer;g_pRunApp->m_pWaiSockHandle = WaiSock_Create(&oSockParam, true);WaiSock_Run(g_pRunApp->m_pWaiSockHandle, true);WaiSock_Destroy(g_pRunApp->m_pWaiSockHandle);

实际上,真正调用waisock库的代码只有最后三行,前面是对WaiSock_Create()的函数赋参数。

以上例子中,WaiSock_Run()函数的第二个参数是true,表示这个函数将阻塞执行,一直到用户调用WaiSock_StopIt()通知该函数退出,否则一直不返回。既然主流程出初始化后,就阻塞执行了,那么我需要监听端口,需要做各种操作怎么办呢?

(1)WaiSock_Create()函数初始化时,有一个OnTimer的参数回调函数,这个是一个定时器,当然可以在这个回调函数中进行监听,与其它TCP建立连接,或者处理其它业务。本程序显然就是在该定时器函数中进行监听,定时记录CPU利用率、内存利用率、磁盘空间、读取监控接口文件等这些业务操作的。

(2)WaiSock_Create()函数初始化时,还有其它,如接受新的连接、与对方连接成功、与对方连接失败、连接断开、收到消息包等回调函数,各种业务处理都在这些回调函数中。

通过以上这些步骤,基本上就很容易建立起了一个socket通信的程序,当然这个程序可以是作为socket的服务端软件,也可以作为socket的客户端软件,或者两者兼具。此外,还有一些功能,可能会用到的,比如:

(1)需要作为服务端监听端口时,调用WaiSock_TCPListen()函数。

(2)需要作为客户端连接对端时,调用WaiSock_TCPConnect()函数。

(3)在需要发送消息包的时候,调用WaiSock_TCPSend()函数发送。

(4)在需要关闭连接的时候,无论是客户端还是服务端的连接,调用WaiSock_Close()函数发送。


此外,waisock还提供了一些辅助函数,便于对TCP连接进行管理,比如:

(1)WaiSock_SetLinkAttacht()函数,用于将一条连接与一个指针的数据结构关联起来。

(2)WaiSock_SetLinkOption()函数,设置一条连接的收发速度最大限制和最大占用内存大小限制。

(3)WaiSock_GetLinkRealtimeInfo()函数,用于获取当前的收发实时速度,用于对TCP连接的监控。

(4)WaiSock_GetLinkList()函数,获取当前所有的TCP连接情况。

以上是socket封装库waisock的基本函数,使用以上函数,就可以实现一个功能完备的socket通信程序。


三、OpenSSL编程例子

除此以外,waisocket封装库,还是提供了SSL通信的功能,都已经包含在以上各个函数中,区别只是其中的函数参数void *pSSLCtx参数是否为空,如果为空,则表示普通的socket通信,如果非空,则表示SSL通信。该指针就是SSL_CTX*类型的指针,只不过为了方便不使用SSL的用户,将指针强制转换成了void*类型。

如果你对OpenSSL编程有一定的了解,可以自己从证书文件中取得SSL_CTX*指针,如果不熟悉OpenSSL,也没有关系,waisock提供了两个辅助函数,用来帮助用户加载证书,以获取SSL_CTX*指针:

(1)WaiSock_CreateSSLCtx_ByFileCert(),该函数根据证书文件,获取SSL_CTX*指针。

(2)WaiSock_CreateSSLCtx_ByX509Cert),如果你的证书不在文件中,而在硬件中,比如USB Key形式的硬件证书,你需要从厂商提供的接口中获取证书的X509*指针,以及EVP_PKEY*私钥,并调用此函数,以获得SSL_CTX*指针。

还有很大一部分用户,作为客户端访问服务端,根本不许要客户端证书,那么怎么办呢?那就更简单,直接以空指针调用以上两个函数之一,就可以获得SSL_CTX*指针。比如waisock自带的01waissldemo例子中就有一代码:

void* pSSLCtx = WaiSock_CreateSSLCtx_ByX509Cert(NULL, NULL, NULL, false);UINT64 iRet = WaiSock_TCPConnect(pAppDemoData->m_pWaiSockHandle, pSSLCtx, "110.75.236.156", 443, 0, pNewPtrUserData, NULL, 0, 0, NULL, 0);
这两句代码就演示了不使用证书进行SSL连接的方法。

四、总结语

    以上介绍了waisock编程的例子,作为入门。可以看出,使用waisock这类封装好的socket库进行TCP编程,还是很方便的,代码很短,但可以完成强大的功能,也体现了作者强大的封装能力。

   使用waisock最大的好处,其实还是在于其内部处理了各种网络和通信异常,避免每个人重新学习带来的巨大成本。简单地socket编程是体会不到这种带来的便利性的,只有趟过很多坑,socket编程很多年,被socket编程折磨得痛不欲生的人,才能真正体会到waisock封装库稳定、可靠带来的巨大好处。



原创粉丝点击