?? znnet.c
字號:
#include "ZnNet.h"
#include "AEEStdLib.h"
void ZnNet_InitNet(PZNNET pZnNet, AEEApplet App)
{
pZnNet->m_App = App;
pZnNet->m_pNetMgr = NULL;
pZnNet->m_pSocket = NULL;
pZnNet->m_pFnResult = NULL;
pZnNet->m_nSentSize = 0;
pZnNet->m_pUserData = NULL;
if(ISHELL_CreateInstance(pZnNet->m_App.m_pIShell, AEECLSID_NET, (void **)&pZnNet->m_pNetMgr)
!= SUCCESS)
{
ZnNet_NetErr(pZnNet, ERR_CREATENET);
return;
}
pZnNet->m_pSocket = INETMGR_OpenSocket(pZnNet->m_pNetMgr, AEE_SOCK_STREAM);
if(!pZnNet->m_pSocket)
{
ZnNet_NetErr(pZnNet, ERR_CREATESOCKET);
return;
}
}
void ZnNet_Connect(PZNNET pZnNet, char * szAddress, uint16 nPort, PFNNOTIFY pFnResCallBack, void * pUser)
{
pZnNet->m_pFnResult = pFnResCallBack;
pZnNet->m_pUserData = pUser;
if(!pZnNet->m_pNetMgr || !pZnNet->m_pSocket)
{
ZnNet_NetErr(pZnNet, ERR_UNKNOWN);
return;
}
pZnNet->m_nPort = nPort;
CALLBACK_Init(&pZnNet->m_ConnCBFunc, ZnNet_CBGetHostByName,pZnNet);
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
INETMGR_GetHostByName(pZnNet->m_pNetMgr, &pZnNet->m_DNSRes, szAddress, &pZnNet->m_ConnCBFunc);
}
void ZnNet_NetErr(PZNNET pZnNet, ERRCODE ErrCode)
{
ZnNet_ReleaseNet(pZnNet);
pZnNet->m_LastResult = ErrCode;
if(pZnNet->m_pFnResult)
pZnNet->m_pFnResult(pZnNet->m_pUserData);
}
void ZnNet_CBGetHostByName(PZNNET pZnNet)
{
switch(pZnNet->m_DNSRes.nResult)
{
case AEE_NET_BADDOMAIN:
case AEE_NET_UNKDOMAIN:
case AEE_NET_ETIMEDOUT:
case EUNSUPPORTED:
case ENOMEMORY:
ZnNet_NetErr(pZnNet, ERR_GETHOSTNAME);
break;
default:
if(pZnNet->m_DNSRes.nResult > 0) // 成功解析
{
uint16 nPort;
int nRes;
nPort = HTONS(pZnNet->m_nPort);
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
if((nRes = ISOCKET_Connect(pZnNet->m_pSocket, pZnNet->m_DNSRes.addrs[0], nPort,
(PFNCONNECTCB)ZnNet_CBConnect, (void *)pZnNet)) != AEE_NET_SUCCESS)
{
if (nRes != AEE_NET_WOULDBLOCK)
{
ZnNet_NetErr(pZnNet, ERR_CONNECT);
break;
}
}
}
else
{
ZnNet_NetErr(pZnNet, ERR_GETHOSTNAME);
break;
}
}
}
void ZnNet_NetTimeOut(PZNNET pZnNet)
{
ZnNet_NetErr(pZnNet, ERR_TIMEOUT);
}
void ZnNet_CBConnect(PZNNET pZnNet, int nErr)
{
if (nErr)
{
ZnNet_NetErr(pZnNet, ERR_CONNECT);
return;
}
pZnNet->m_LastResult = ERR_SUCCESS;
pZnNet->m_pFnResult(pZnNet->m_pUserData);
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
}
void ZnNet_ReleaseNet(PZNNET pZnNet)
{
if(pZnNet->m_pSocket)
{
ISOCKET_Cancel(pZnNet->m_pSocket, NULL, NULL);
CALLBACK_Cancel(&pZnNet->m_ConnCBFunc);
ISOCKET_Release(pZnNet->m_pSocket);
pZnNet->m_pSocket = NULL;
}
if(pZnNet->m_pNetMgr)
{
INETMGR_Release(pZnNet->m_pNetMgr);
pZnNet->m_pNetMgr = NULL;
}
pZnNet->m_nSentSize = 0;
pZnNet->m_nRecvSize = 0;
if(pZnNet->m_App.m_pIShell)
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
}
void ZnNet_NetWrite(PZNNET pZnNet, void * pData, uint16 nSize, PFNNOTIFY pFnResCallBack, void * pUser)
{
char *psz = NULL;
int cbWrite;
int rv;
pZnNet->m_pFnResult = pFnResCallBack;
pZnNet->m_pUserData = pUser;
if(!pZnNet->m_pNetMgr || !pZnNet->m_pSocket)
{
ZnNet_NetErr(pZnNet, ERR_UNKNOWN);
return;
}
pZnNet->m_pData = pData;
pZnNet->m_nSize = nSize;
pZnNet->m_nTransSize = nSize;
psz = (char *)pData;
cbWrite = nSize;
while(cbWrite > 0)
{
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
rv = ISOCKET_Write(pZnNet->m_pSocket, (byte *)psz, (uint16)cbWrite);
if(rv == AEE_NET_WOULDBLOCK)
{
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISOCKET_Writeable(pZnNet->m_pSocket, (PFNNOTIFY)ZnNet_CBNetWrite, (void *)pZnNet);
return;
}
else if(rv == AEE_NET_ERROR)
{
ZnNet_NetErr(pZnNet, ERR_WRITE);
return;
}
pZnNet->m_nSentSize += rv;
cbWrite -= rv;
psz += rv;
}
if(cbWrite == 0)
{
pZnNet->m_nSentSize = 0;
pZnNet->m_LastResult = ERR_SUCCESS;
pZnNet->m_pFnResult(pZnNet->m_pUserData);
}
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
}
void ZnNet_NetRead(PZNNET pZnNet, void * pBuf, uint16 nSize, PFNNOTIFY pFnResCallBack, void * pUser)
{
int cbRead, rv;
char * psz;
pZnNet->m_pFnResult = pFnResCallBack;
pZnNet->m_pUserData = pUser;
if(!pZnNet->m_pNetMgr || !pZnNet->m_pSocket)
{
ZnNet_NetErr(pZnNet, ERR_UNKNOWN);
return;
}
pZnNet->m_pData = pBuf;
pZnNet->m_nSize = nSize;
pZnNet->m_nTransSize = nSize;
psz = (char *)pBuf;
cbRead = nSize;
while(cbRead > 0)
{
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
rv = ISOCKET_Read(pZnNet->m_pSocket, (byte *)psz, cbRead);
if (rv == AEE_NET_WOULDBLOCK)
{
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISOCKET_Readable(pZnNet->m_pSocket, (PFNNOTIFY)ZnNet_CBNetRead, (void*)pZnNet);
return;
}
else if (rv == AEE_NET_ERROR)
{
ZnNet_NetErr(pZnNet, ERR_READ);
return;
}
else if(rv > 0)
{
pZnNet->m_nRecvSize += rv;
cbRead -= rv;
psz += rv;
}
else
{
ZnNet_NetErr(pZnNet, ERR_READ);
return;
}
}
if(cbRead == 0)
{
pZnNet->m_nRecvSize = 0;
pZnNet->m_LastResult = ERR_SUCCESS;
pZnNet->m_pFnResult(pZnNet->m_pUserData);
}
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
}
void ZnNet_CBNetWrite(PZNNET pZnNet)
{
char *psz = NULL;
int cbWrite;
int rv;
if(!pZnNet->m_pNetMgr || !pZnNet->m_pSocket)
{
ZnNet_NetErr(pZnNet, ERR_UNKNOWN);
return;
}
psz = (char *)((byte *)pZnNet->m_pData + pZnNet->m_nSentSize);
cbWrite = pZnNet->m_nSize - pZnNet->m_nSentSize;
while(cbWrite > 0)
{
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
rv = ISOCKET_Write(pZnNet->m_pSocket, (byte *)psz, (uint16)cbWrite);
if(rv == AEE_NET_WOULDBLOCK)
{
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISOCKET_Writeable(pZnNet->m_pSocket, (PFNNOTIFY)ZnNet_CBNetWrite, (void *)pZnNet);
return;
}
else if(rv == AEE_NET_ERROR)
{
ZnNet_NetErr(pZnNet, ERR_WRITE);
return;
}
pZnNet->m_nSentSize += rv;
cbWrite -= rv;
psz += rv;
}
if(cbWrite == 0)
{
pZnNet->m_nSentSize = 0;
pZnNet->m_LastResult = ERR_SUCCESS;
pZnNet->m_pFnResult(pZnNet->m_pUserData);
}
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
}
void ZnNet_CBNetRead(PZNNET pZnNet)
{
int cbRead, rv;
char * psz;
if(!pZnNet->m_pNetMgr || !pZnNet->m_pSocket)
{
ZnNet_NetErr(pZnNet, ERR_UNKNOWN);
return;
}
psz = (char *)pZnNet->m_pData + pZnNet->m_nRecvSize;
cbRead = pZnNet->m_nSize - pZnNet->m_nRecvSize;
while(cbRead > 0)
{
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
rv = ISOCKET_Read(pZnNet->m_pSocket, (byte *)psz, cbRead);
if (rv == AEE_NET_WOULDBLOCK)
{
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISHELL_SetTimer(pZnNet->m_App.m_pIShell, _NET_TIMEOUT_, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
ISOCKET_Readable(pZnNet->m_pSocket, (PFNNOTIFY)ZnNet_CBNetRead, (void *)pZnNet);
return;
}
else if (rv == AEE_NET_ERROR)
{
ZnNet_NetErr(pZnNet, ERR_READ);
return;
}
else if(rv > 0)
{
pZnNet->m_nRecvSize += rv;
cbRead -= rv;
psz += rv;
}
else
{
ZnNet_NetErr(pZnNet, ERR_READ);
return;
}
}
if(cbRead == 0)
{
pZnNet->m_nRecvSize = 0;
pZnNet->m_LastResult = ERR_SUCCESS;
pZnNet->m_pFnResult(pZnNet->m_pUserData);
}
ISHELL_CancelTimer(pZnNet->m_App.m_pIShell, (PFNNOTIFY)ZnNet_NetTimeOut, pZnNet);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -