📄 net.c
字号:
////////////////////////////////////////////////////////////////////////////////////////////
//Net.c 有关网络通信的功能
#include "Type.h"
//发送数据包,如果需要异步就注册回调函数,直到发送一个包
void OnSockWrite(SAppData* psAppData)
{
int iRet;
//试发送
iRet = ISOCKET_Write(psAppData->pISocket, ((BYTE*)&psAppData->sSendPack) + psAppData->btSendedLen,
(uint16)(sizeof(psAppData->sSendPack) - psAppData->btSendedLen));
//出错?
if (iRet == AEE_NET_ERROR)
{
SHOW_ERROR_MEG(psAppData, "Send error!");
return;
}
//下一次再写?
if(iRet == AEE_NET_WOULDBLOCK)
{//下一次写
ISOCKET_Writeable(psAppData->pISocket, (PFNNOTIFY)OnSockWrite, psAppData);
return;
}
//成功发送,但可能没有发送完
psAppData->btSendedLen += iRet;
//发送的数据包太长?
if(psAppData->btSendedLen > sizeof(psAppData->sSendPack))
{
SHOW_ERROR_MEG(psAppData, "Send pack error!");
return;
}
//OK! 一切正常
if(psAppData->btSendedLen == sizeof(psAppData->sSendPack))
{//发完一个指令
//清空这个指令
psAppData->sSendPack.pbtPack4Send[0] = 0;
psAppData->sSendPack.pbtPack4Send[1] = 0;
psAppData->sSendPack.bBomb = FALSE;
//...再不发数据包了,直到下一次收到一个完整的视图再由OnSockRead调用此函数发一个包
}else
{//还未发完这个指令,继续发
ISOCKET_Writeable(psAppData->pISocket, (PFNNOTIFY)OnSockWrite, psAppData);
}
}
//接收数据包,如果需要异步就注册回调函数,注意!要不停地接收服务器的数据包,收完一个紧接着注册回调,准备收下一个
void OnSockRead(SAppData* psAppData)
{
int iRet;
//试接收
iRet = ISOCKET_Read(psAppData->pISocket, ((BYTE*)(psAppData->pbtGrid)) + psAppData->dwRecvedLen, sizeof(psAppData->pbtGrid) - psAppData->dwRecvedLen);
//出错?
if(iRet == AEE_NET_ERROR)
{
SHOW_ERROR_MEG(psAppData, "Recv error!");
return;
}
//下一次再读?
if(iRet == AEE_NET_WOULDBLOCK)
{
ISOCKET_Readable(psAppData->pISocket, (PFNNOTIFY)OnSockRead, psAppData);
return;
}
//OK!收到了iRet个字节数据
psAppData->dwRecvedLen += iRet;
//收到的数据包太长?
if(psAppData->dwRecvedLen > sizeof(psAppData->pbtGrid))
{
SHOW_ERROR_MEG(psAppData, "Recv pack error!");
return;
}
//OK! 一切正常
if(psAppData->dwRecvedLen == sizeof(psAppData->pbtGrid))
{//收满一个视图
psAppData->dwRecvedLen = 0;
//刷屏
RefurbishScreen(psAppData);
//向服务器发送这个手机玩家的操作数据
psAppData->btSendedLen = 0;
OnSockWrite(psAppData);
}
//继续接收来自服务器的数据
ISOCKET_Readable(psAppData->pISocket, (PFNNOTIFY)OnSockRead, psAppData);
}
//连接到了远程,或出错
void OnConnect(void* pUser, int nError)
{
if( nError != AEE_NET_SUCCESS )
{//连接到远程失败
SHOW_ERROR_MEG(pUser, "Connect error!");
return;
}
//OK! 成功连接到服务器,接收来自服务器的数据包,并不断刷屏
((SAppData*)pUser)->dwRecvedLen = 0;
OnSockRead(pUser);
}
//已经得到了IP地址值,或出错
//pvAppData: Applet数地址
void OnHostName(void *pvAppData)
{
if( (((SAppData*)pvAppData)->sDNSResult.nResult <= 0) || (((SAppData*)pvAppData)->sDNSResult.nResult > AEEDNSMAXADDRS) )
{//DNS出错
SHOW_ERROR_MEG(pvAppData, "DNS error!");
return;
}
//OK! IP地值得到了((SAppData*)pvAppData)->sDNSResult.addrs[0]
//开始向远程发动连接,连接成功后接收来自服务器的数据包
if( (ISOCKET_Connect(((SAppData*)pvAppData)->pISocket, ((SAppData*)pvAppData)->sDNSResult.addrs[0], SERVER_PORT, OnConnect, pvAppData)) != AEE_NET_SUCCESS )
{
SHOW_ERROR_MEG(pvAppData, "Start connect error!");
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -