/******************************************************************************* * 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 (2000) #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; }