From 67ca69985af9109a0603a1cde71f21b940c059ff Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期四, 15 五月 2025 09:12:53 +0800
Subject: [PATCH] 完全将免布线标签代码移植过来版本

---
 keil/include/components/internet/src/Socket.c |  893 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 893 insertions(+), 0 deletions(-)

diff --git a/keil/include/components/internet/src/Socket.c b/keil/include/components/internet/src/Socket.c
new file mode 100644
index 0000000..7c0ffc7
--- /dev/null
+++ b/keil/include/components/internet/src/Socket.c
@@ -0,0 +1,893 @@
+/*******************************************************************************
+ * File Name         : Socket.c
+ * Description       :
+ * Created on        : 2018年5月17日
+ * Author            : www.hido-studio.com
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                              Include Files                                  *
+ *******************************************************************************/
+#include "string.h"
+#include "Socket.h"
+#include "HIDO_Util.h"
+#include "HIDO_Debug.h"
+#include "HIDO_ArraryQueue.h"
+
+/*******************************************************************************
+ *                                  Macro                                      *
+ *******************************************************************************/
+/* SOICKET相关 */
+#define SOCKET_SEND_QUEUE_BUF_SIZE                    (512)
+#define SOCKET_RECV_QUEUE_BUF_SIZE                    (512)
+#define SOCKET_SEND_QUEUE_MEMBER_CNT                  16
+#define SOCKET_RECV_QUEUE_MEMBER_CNT                  16
+
+/*******************************************************************************
+ *                             Type Definition                                 *
+ *******************************************************************************/
+
+typedef struct
+{
+    E_SocketState m_eState;
+    E_SocketType m_eType;
+    HIDO_BOOL m_bHasRecvData;
+    HIDO_INT32 m_i32ID;
+    FN_SocketEventProc m_fnEventProc;
+    HIDO_VOID *m_pArg;
+
+    HIDO_CHAR m_acRemoteAddr[42];
+    HIDO_UINT16 m_u16RemotePort;
+
+    HIDO_VLQStruct m_stSendQueue;
+    HIDO_VLQStruct m_stRecvQueue;
+    HIDO_ArraryQueueStruct m_stRecvInfoQueue;
+    HIDO_ArraryQueueStruct m_stTCPRecvQueue;
+
+    HIDO_UINT8 l_au8SendQueueBuf[SOCKET_SEND_QUEUE_BUF_SIZE];
+    HIDO_UINT8 l_au8RecvQueueBuf[SOCKET_RECV_QUEUE_BUF_SIZE];
+
+    HIDO_BOOL m_bUseHeartbeat;
+    HIDO_UINT32 m_u32HeartbeatFreq;
+    HIDO_CHAR m_acHeartbeatData[128];
+}ST_SocketData;
+
+/*******************************************************************************
+ *                             Local Variable                                  *
+ *******************************************************************************/
+static ST_SocketData l_astSocketData[SOCKET_NUM];
+
+/*******************************************************************************
+ *                        Local Function Declaration                           *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                             Local Function                                  *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                             Global Function                                 *
+ *******************************************************************************/
+/*******************************************************************************
+ * Function Name     : Socket_HaveRecvData
+ * Description       : 通知Socket有数据需要接收
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_HaveRecvData(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        l_astSocketData[_i32SockID].m_bHasRecvData = HIDO_TRUE;
+
+        return HIDO_OK;
+    }
+
+    return HIDO_ERR;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_NoRecvData
+ * Description       : 通知Socket没有数据需要接收
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_NoRecvData(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        l_astSocketData[_i32SockID].m_bHasRecvData = HIDO_FALSE;
+
+        return HIDO_OK;
+    }
+
+    return HIDO_ERR;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_HasRecvData
+ * Description       : 获取Socket是否有数据需要接收
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_TRUE 有数据需要接收, HIDO_FALSE 没有数据需要接收
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_BOOL Socket_HasRecvData(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        return l_astSocketData[_i32SockID].m_bHasRecvData;
+    }
+
+    return HIDO_FALSE;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_GetSocketRecvQueue
+ * Description       : 获取Socket接收队列
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : Socket接收队列
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_VLQStruct *Socket_GetSocketRecvQueue(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        return &l_astSocketData[_i32SockID].m_stRecvQueue;
+    }
+
+    return HIDO_NULL;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_GetSocketSendQueue
+ * Description       : 获取Socket发送队列
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : Socket发送队列
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_VLQStruct *Socket_GetSocketSendQueue(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        return &l_astSocketData[_i32SockID].m_stSendQueue;
+    }
+
+    return HIDO_NULL;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_GetType
+ * Description       : 获取Socke类型
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : Socke类型
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+E_SocketType Socket_GetType(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        return l_astSocketData[_i32SockID].m_eType;
+    }
+
+    return SOCKET_TYPE_NONE;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_GetSocketState
+ * Description       : 获取Socke内部状态
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : Socke内部状态
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+E_SocketState Socket_GetSocketState(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        return l_astSocketData[_i32SockID].m_eState;
+    }
+
+    return SOCKET_STATE_IDLE;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_SetSocketState
+ * Description       : 设置Socke内部状态
+ * Input             : _i32Sock Socket描述符
+ *                   : _eState Socke内部状态
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_SetSocketState(HIDO_INT32 _i32SockID, E_SocketState _eState)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        l_astSocketData[_i32SockID].m_eState = _eState;
+
+        return HIDO_OK;
+    }
+
+    return HIDO_ERR;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_GetRemoteAddr
+ * Description       : 获取Socket远程地址
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : 远程地址
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_CHAR *Socket_GetRemoteAddr(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        return l_astSocketData[_i32SockID].m_acRemoteAddr;
+    }
+
+    return "";
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_GetRemotePort
+ * Description       : 获取Socket远程端口
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : 远程端口
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_UINT16 Socket_GetRemotePort(HIDO_INT32 _i32SockID)
+{
+    if(_i32SockID < SOCKET_NUM)
+    {
+        return l_astSocketData[_i32SockID].m_u16RemotePort;
+    }
+
+    return 0;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_RecvAll
+ * Description       : 全部Socket需要接收数据的通知
+ * Input             : None
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_RecvAll(void)
+{
+    HIDO_INT32 i32SockID = 0;
+    ST_SocketData *pstSocketData = HIDO_NULL;
+
+    for(i32SockID = 0; i32SockID < SOCKET_NUM; i32SockID++)
+    {
+        pstSocketData = &l_astSocketData[i32SockID];
+        if(pstSocketData != HIDO_NULL && SOCKET_STATE_CONNECTED == pstSocketData->m_eState)
+        {
+            pstSocketData->m_bHasRecvData = HIDO_TRUE;
+        }
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_ClosedAll
+ * Description       : 全部Socket被断开的通知
+ * Input             : None
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_ClosedAll(void)
+{
+    HIDO_INT32 i32SockID = 0;
+    ST_SocketData *pstSocketData = HIDO_NULL;
+
+    for(i32SockID = 0; i32SockID < SOCKET_NUM; i32SockID++)
+    {
+        pstSocketData = &l_astSocketData[i32SockID];
+
+        switch (pstSocketData->m_eState)
+        {
+            case SOCKET_STATE_CONNECT:
+            case SOCKET_STATE_CLOSE_BEFORE_CONNECT:
+            case SOCKET_STATE_CONNECTED:
+            {
+                pstSocketData->m_bHasRecvData = HIDO_FALSE;
+                pstSocketData->m_eState = SOCKET_STATE_CLOSED;
+
+                if (pstSocketData->m_fnEventProc != HIDO_NULL)
+                {
+                    pstSocketData->m_fnEventProc(i32SockID, SOCKET_EVENT_CLOSED, pstSocketData->m_pArg);
+                }
+                break;
+            }
+            default:
+            {
+                break;
+            }
+        }
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_OnConnectFailed
+ * Description       : Socket连接失败时的内部通知
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_OnConnectFailed(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    pstSocketData->m_eState = SOCKET_STATE_CONNECT_FAILED;
+    if(pstSocketData->m_fnEventProc != HIDO_NULL)
+    {
+        pstSocketData->m_fnEventProc(_i32SockID, SOCKET_EVENT_CONNECT_FAILED, pstSocketData->m_pArg);
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_OnConnected
+ * Description       : Socket连接成功时的内部通知
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_OnConnected(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    pstSocketData->m_eState = SOCKET_STATE_CONNECTED;
+
+    /* 重置队列 */
+#if 0
+    HIDO_VLQInit(&pstSocketData->m_stSendQueue, pstSocketData->l_au8SendQueueBuf,
+            SOCKET_SEND_QUEUE_BUF_SIZE, SOCKET_SEND_QUEUE_MEMBER_CNT);
+    if(SOCKET_TYPE_TCP == pstSocketData->m_eType)
+    {
+        HIDO_ArraryQueueInit(&pstSocketData->m_stTCPRecvQueue, pstSocketData->l_au8RecvQueueBuf,
+                SOCKET_RECV_QUEUE_BUF_SIZE, sizeof(HIDO_UINT8));
+    }
+    else
+    {
+        HIDO_VLQInit(&pstSocketData->m_stRecvQueue, pstSocketData->l_au8RecvQueueBuf,
+                SOCKET_RECV_QUEUE_BUF_SIZE, SOCKET_RECV_QUEUE_MEMBER_CNT);
+    }
+#endif
+		
+    /* 通知上层 */
+    if(pstSocketData->m_fnEventProc != HIDO_NULL)
+    {
+        pstSocketData->m_fnEventProc(_i32SockID, SOCKET_EVENT_CONNECTED, pstSocketData->m_pArg);
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_OnClosed
+ * Description       : Socket被关闭时的内部通知
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_OnClosed(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    if(SOCKET_STATE_CLOSE_BEFORE_CONNECT == pstSocketData->m_eState)
+    {
+    	return HIDO_ERR;
+    }
+
+    pstSocketData->m_eState = SOCKET_STATE_CLOSED;
+    if(pstSocketData->m_fnEventProc != HIDO_NULL)
+    {
+        pstSocketData->m_fnEventProc(_i32SockID, SOCKET_EVENT_CLOSED, pstSocketData->m_pArg);
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_RecvData
+ * Description       : Socket收到数据时的内部处理
+ * Input             : _i32Sock Socket描述符
+ *                   : _pu8Data 收到的数据
+ *                   : _u32Len 收到的数据长度
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_RecvData(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+    HIDO_UINT32 i = 0;
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    if(SOCKET_TYPE_TCP == pstSocketData->m_eType)
+    {
+        for(i = 0; i < _u32Len; i++)
+        {
+        	if(HIDO_ArraryQueueIn(&(pstSocketData->m_stTCPRecvQueue), &_pu8Data[i]) != HIDO_OK)
+        	{
+        	    return HIDO_ERR;
+        	}
+        }
+    }
+    else
+    {
+    	HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
+
+        pstMember = HIDO_VLQGetEnqueueMember(&l_astSocketData[_i32SockID].m_stRecvQueue, _u32Len);
+        if (pstMember != HIDO_NULL)
+        {
+            memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len);
+
+            HIDO_VLQEnqueue(&l_astSocketData[_i32SockID].m_stRecvQueue, pstMember);
+        }
+        else
+        {
+            HIDO_Debug("Socket[%u] Recv Buffer Full\r\n", _i32SockID);
+        }
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_OnRecv
+ * Description       : Socket收到数据时的内部通知
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_OnRecv(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    if(pstSocketData->m_fnEventProc != HIDO_NULL)
+    {
+        pstSocketData->m_fnEventProc(_i32SockID, SOCKET_EVENT_RECV_DATA, pstSocketData->m_pArg);
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_Create
+ * Description       : Socket创建
+ * Input             : _eSocketType Socket类型
+ *                   : _fnEventProc Socket事件处理函数
+ *                   : _pArg 参数
+ * Output            : _pi32SockID Socket描述符
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_Create(HIDO_INT32 *_pi32SockID, E_SocketType _eSocketType, FN_SocketEventProc _fnEventProc, HIDO_VOID *_pArg)
+{
+    HIDO_INT32 i32SockID = 0;
+    ST_SocketData *pstSocketData = HIDO_NULL;
+
+    for(i32SockID = 0; i32SockID < SOCKET_NUM; i32SockID++)
+    {
+        pstSocketData = &l_astSocketData[i32SockID];
+        if(pstSocketData != HIDO_NULL && (SOCKET_STATE_IDLE == pstSocketData->m_eState))
+        {
+            HIDO_UtilBzero(pstSocketData, sizeof(ST_SocketData));
+
+            pstSocketData->m_i32ID = i32SockID;
+            pstSocketData->m_eType = _eSocketType;
+            pstSocketData->m_eState = SOCKET_STATE_CREATED;
+            pstSocketData->m_fnEventProc = _fnEventProc;
+            pstSocketData->m_pArg = _pArg;
+            
+            HIDO_VLQInit(&pstSocketData->m_stSendQueue, pstSocketData->l_au8SendQueueBuf,
+                    SOCKET_SEND_QUEUE_BUF_SIZE, SOCKET_SEND_QUEUE_MEMBER_CNT);
+            
+            if(SOCKET_TYPE_TCP == _eSocketType)
+            {
+            	HIDO_ArraryQueueInit(&pstSocketData->m_stTCPRecvQueue, pstSocketData->l_au8RecvQueueBuf,
+            			SOCKET_RECV_QUEUE_BUF_SIZE, sizeof(HIDO_UINT8));
+            }
+            else
+            {
+                HIDO_VLQInit(&pstSocketData->m_stRecvQueue, pstSocketData->l_au8RecvQueueBuf,
+                		SOCKET_RECV_QUEUE_BUF_SIZE, SOCKET_RECV_QUEUE_MEMBER_CNT);
+            }
+
+            *_pi32SockID = i32SockID;
+
+            return HIDO_OK;
+        }
+    }
+
+    return HIDO_ERR;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_Connect
+ * Description       : Socket连接
+ * Input             : _i32Sock Socket描述符
+ *                   : _pcRemoteAddr 目标地址
+ *                   : _u16RemotePort 目标端口
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_Connect(HIDO_INT32 _i32SockID, HIDO_CHAR *_pcRemoteAddr, HIDO_UINT16 _u16RemotePort)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    HIDO_UtilSnprintf(pstSocketData->m_acRemoteAddr, sizeof(pstSocketData->m_acRemoteAddr), "%s", _pcRemoteAddr);
+    pstSocketData->m_u16RemotePort = _u16RemotePort;
+    pstSocketData->m_eState = SOCKET_STATE_CONNECT;
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_Close
+ * Description       : 关闭一个Socket
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_Close(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    if(pstSocketData->m_eState != SOCKET_STATE_IDLE && pstSocketData->m_eState != SOCKET_STATE_CLOSED)
+    {
+        pstSocketData->m_eState = SOCKET_STATE_CLOSE;
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_Destroy
+ * Description       : 销毁一个Socket
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_Destroy(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    pstSocketData->m_eState = SOCKET_STATE_IDLE;
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_IsSendQueueEmpty
+ * Description       : 判断发送队列是否为空
+ * Input             : _i32Sock Socket描述符
+ * Output            : None
+ * Return            : HIDO_TRUE 发送队列为空, HIDO_FALSE 发送队列不为空
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_BOOL Socket_IsSendQueueEmpty(HIDO_INT32 _i32SockID)
+{
+    HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL)
+    {
+        return HIDO_FALSE;
+    }
+
+    pstMember = HIDO_VLQGetDequeueMember(&pstSocketData->m_stSendQueue);
+    if(HIDO_NULL == pstMember)
+    {
+        return HIDO_TRUE;
+    }
+
+    return HIDO_FALSE;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_Send
+ * Description       : Socket发送数据
+ * Input             : _i32Sock Socket描述符
+ *                   : _pu8Data 发送的数据
+ *                   : _u32DataLen 发送的数据长度
+ * Output            : None
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_Send(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32DataLen)
+{
+    HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL || _u32DataLen == 0)
+    {
+        return HIDO_ERR;
+    }
+
+    pstMember = HIDO_VLQGetEnqueueMember(&pstSocketData->m_stSendQueue, _u32DataLen); /* 获取入队空间 */
+    if(HIDO_NULL == pstMember)
+    {
+        HIDO_Debug("socket[%d] send buf full\r\n", _i32SockID);
+
+        return HIDO_ERR;
+    }
+
+    memcpy(pstMember->m_pDataAddr, _pu8Data, _u32DataLen);
+    HIDO_VLQEnqueue(&pstSocketData->m_stSendQueue, pstMember); /* 入队 */
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_IsClosed
+ * Description       : 检查Socket是否已断开
+ * Input             : _i32Sock Socket描述符
+ * Output            : _pbResult 断开状态 HIDO_TRUE 已断开  HIDO_FALSE 未断开
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_IsClosed(HIDO_INT32 _i32SockID, HIDO_BOOL *_pbResult)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || HIDO_NULL == _pbResult)
+    {
+        return HIDO_ERR;
+    }
+
+    if(SOCKET_STATE_CLOSED == pstSocketData->m_eState || SOCKET_STATE_IDLE == pstSocketData->m_eState
+    		|| SOCKET_STATE_CONNECT_FAILED == pstSocketData->m_eState || SOCKET_STATE_CREATED == pstSocketData->m_eState)
+    {
+    	*_pbResult = HIDO_TRUE;
+    }
+    else
+    {
+    	*_pbResult = HIDO_FALSE;
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_IsConnected
+ * Description       : 检查Socket是否已连接
+ * Input             : _i32Sock Socket描述符
+ * Output            : _pbResult 连接状态 HIDO_TRUE 已连接  HIDO_FALSE 未连接
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_IsConnected(HIDO_INT32 _i32SockID, HIDO_BOOL *_pbResult)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || HIDO_NULL == _pbResult)
+    {
+        return HIDO_ERR;
+    }
+
+    if(SOCKET_STATE_CONNECTED == pstSocketData->m_eState)
+    {
+        *_pbResult = HIDO_TRUE;
+    }
+    else
+    {
+        *_pbResult = HIDO_FALSE;
+    }
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_UseHeartbeat
+ *******************************************************************************/
+HIDO_BOOL Socket_UseHeartbeat(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM)
+    {
+        return HIDO_FALSE;
+    }
+
+    return pstSocketData->m_bUseHeartbeat;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_SetHeartbeatData
+ *******************************************************************************/
+HIDO_INT32 Socket_HeartbeatConfig(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len, HIDO_UINT32 _u32HeartbeatFreq)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM)
+    {
+        return HIDO_ERR;
+    }
+
+    pstSocketData->m_bUseHeartbeat = HIDO_TRUE;
+    pstSocketData->m_u32HeartbeatFreq = _u32HeartbeatFreq;
+    HIDO_UtilByteArrayToHexString(_pu8Data, _u32Len, pstSocketData->m_acHeartbeatData, sizeof(pstSocketData->m_acHeartbeatData), HIDO_FALSE);
+
+    return HIDO_OK;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_GetHeartbeatFreq
+ *******************************************************************************/
+HIDO_UINT32 Socket_GetHeartbeatFreq(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM)
+    {
+        return 300;
+    }
+
+    return pstSocketData->m_u32HeartbeatFreq;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_GetHeartbeatFreq
+ *******************************************************************************/
+HIDO_CHAR *Socket_GetHeartbeatData(HIDO_INT32 _i32SockID)
+{
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM)
+    {
+        return 300;
+    }
+
+    return pstSocketData->m_acHeartbeatData;
+}
+
+/*******************************************************************************
+ * Function Name     : Socket_Recv
+ * Description       : 从Socket接收队列中读取数据
+ * Input             : _i32Sock Socket描述符
+ *                   : _u32RecvBuffSize 读取数据的缓存地址
+ * Output            : _pu8RecvBuff 读取数据的缓存
+ *                   : _pu32RecvLen 数据长度
+ * Return            : HIDO_OK 成功, HIDO_ERR 失败
+ * Author            : www.hido-studio.com
+ * Modified Date:    : 2018年5月17日
+ *******************************************************************************/
+HIDO_INT32 Socket_Recv(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8RecvBuff, HIDO_UINT32 _u32RecvBuffSize, HIDO_UINT32 *_pu32RecvLen)
+{
+    HIDO_INT32 i32Result = HIDO_ERR;
+    HIDO_VLQMemberStruct *pstMember = HIDO_NULL;
+    ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID];
+
+    if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL || _pu32RecvLen == HIDO_NULL)
+    {
+        return HIDO_ERR;
+    }
+
+    if(SOCKET_TYPE_TCP == pstSocketData->m_eType)
+    {
+    	HIDO_UINT32 i = 0;
+    	HIDO_UINT32 u32RecvLen = 0;
+
+    	for(i = 0; i < _u32RecvBuffSize; i++)
+    	{
+    		if(HIDO_ArraryQueueOut(&pstSocketData->m_stTCPRecvQueue, &_pu8RecvBuff[i]) != HIDO_OK)
+    		{
+    			*_pu32RecvLen = u32RecvLen;
+    			return HIDO_OK;
+    		}
+
+    		u32RecvLen++;
+    	}
+
+    	*_pu32RecvLen = u32RecvLen;
+    	i32Result = HIDO_OK;
+    }
+    else
+    {
+        pstMember = HIDO_VLQGetDequeueMember(&pstSocketData->m_stRecvQueue);
+        if(pstMember != HIDO_NULL)
+        {
+            if(_u32RecvBuffSize > pstMember->m_u32DataLen)
+            {
+                memcpy(_pu8RecvBuff, pstMember->m_pDataAddr, pstMember->m_u32DataLen);
+                *_pu32RecvLen = pstMember->m_u32DataLen;
+                i32Result = HIDO_OK;
+            }
+
+            HIDO_VLQDequeue(&pstSocketData->m_stRecvQueue, pstMember);
+        }
+    }
+
+    return i32Result;
+}
+

--
Gitblit v1.9.3