⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net.c

📁 手机开发环境BREW实例
💻 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 + -