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

📄 conn.c

📁 brew中开发的个人小游戏
💻 C
字号:
#include "vacation.h"
//////////////////////////////////////////////////////////////////////////
//xxx.xxx.xxx.xxx=>uint32
INAddr xConvertToINAddr(char *psz)
{
	INAddr ul = 0;
	int nByte = 0;
	char c;

	if(!psz)
		return 0;

	while (ISDIGIT(*psz))
	{
		int n = 0;
		while ( ISDIGIT(c=*psz))
		{
			n = n*10 + (c - '0');
			++psz;
		}
		((char*)&ul)[nByte++] = n;
		if (nByte == 4 || *psz != '.')
			break;
		++psz;
	}
	if (nByte < 4 || ISALNUM(*psz))
		ul = 0xFFFFFFFF;
	return ul;
}
//////////////////////////////////////////////////////////////////////////
//
void StartSocket(CTheApp* pApp)
{
	//INetMgr*	pINetMgr=NULL;
	//ISocket*	pISocket=NULL;
	INAddr		nodeINAddr;
	uint16		nPort;
	

	nodeINAddr=xConvertToINAddr(IPADDR);
	nPort=AEE_htons(PORT);
	
	pApp->bIsConnecting=TRUE;
	CleanSocket(pApp);
	if(ISHELL_CreateInstance(pApp->a.m_pIShell,AEECLSID_NET,(void**)&pApp->pINetMgr)==ENOMEMORY)
	{
		ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_MEMORY_FAILED,0);
		return;
	}
	
	if(pApp->pINetMgr)
		pApp->pISocket=INETMGR_OpenSocket(pApp->pINetMgr,AEE_SOCK_STREAM);
	
	if(pApp->pISocket)
	{
		ISOCKET_Connect(pApp->pISocket,nodeINAddr,nPort,(PFNCONNECTCB)ConnectSocketCB,(void*)pApp);
		/*
		if(pApp->vtCurrent!=INIT_VIEW) //下载动画.
		{
			DispBootAnim(pApp);//要改用下载动画
		}*/
	}
	else//Socket can not
	{
		ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_SOCKET_FAILED,0);
		return;
	}
	pApp->nGrowMem=0;
	return;
}
//////////////////////////////////////////////////////////////////////////
//
static void ConnectSocketCB(CTheApp* pApp,int errCode)
{
	//ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_GF,EVT_USER,0,0);
	if(errCode!=AEE_NET_SUCCESS)//连接socket出错
	{
		ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_SOCKET_FAILED,0);
		return;
	}
	else
		WriteSocketCB(pApp);
	return;	
}
//////////////////////////////////////////////////////////////////////////
//
static void WriteSocketCB(CTheApp* pApp)
{
	uint16 rv;
	uint16 nR;
	char* pszWriteData;
	pszWriteData=pApp->pszSendData;


	nR=(uint16)STRLEN(pszWriteData);
	//这里算法有bug,但不改了.因为在现在情况下不会出错.
	while(nR>0)
	{
		rv=(uint16)ISOCKET_Write(pApp->pISocket,(byte*)pszWriteData,(uint16)nR);
        if(rv==AEE_NET_WOULDBLOCK)//写阻塞,继续回调写
		{
			ISOCKET_Writeable(pApp->pISocket,(PFNNOTIFY)WriteSocketCB,(void*)pApp);
			return;
		}
		else if(rv==AEE_NET_ERROR)//写socket出错
		{
			ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_SOCKET_FAILED,0);
			return;
		}
		nR-=rv;
		pszWriteData+=rv;				
	}
	ReadSocketCB(pApp);
	return;
}
///////////////////////////////////////////////////////////////////////////
static void ReadSocketCB(CTheApp* pApp)
{
	int rv;
	char pszReadData[512]={0};
	rv=ISOCKET_Read(pApp->pISocket,(byte*)pszReadData,sizeof(pszReadData));
	if(rv==AEE_NET_WOULDBLOCK)//读阻塞,继续回调
	{
		ISOCKET_Readable(pApp->pISocket,(PFNNOTIFY)ReadSocketCB,(void*)pApp);
		return;
	}
	else
	{
		if(rv==AEE_NET_ERROR)//读出错
		{
			ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_SOCKET_FAILED,0);
			return;
		}
		else
		{
			if(rv>0)//读了数据
			{
			    pApp->nGrowMem+=rv;
				if((pApp->pszReceiveData=(char*)REALLOC(pApp->pszReceiveData,pApp->nGrowMem))==NULL)//内存分配不足
				{
					ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_MEMORY_FAILED,0);
					return;
				}
				//SPRINTF(pApp->pszReceiveData,pszReadData);
				MEMCPY(pApp->pszReceiveData+pApp->nGrowMem-rv,pszReadData,rv);
				ISOCKET_Readable(pApp->pISocket,(PFNNOTIFY)ReadSocketCB,pApp);//继续回调读
			    return;
			}
			else //rv=0,没有数据可读了.
			{
				CleanSocket(pApp);//数据读完,释放socket.
				
				if((pApp->pszReceiveData=(char*)REALLOC(pApp->pszReceiveData,pApp->nGrowMem+1))==NULL)
				{
					ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_MEMORY_FAILED,0);
					return;
				}
				else
				{
					pApp->pszReceiveData[pApp->nGrowMem]='\0';
					//log(pApp,pApp->pszReceiveData);
					ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_SOCKET_OK,0);
				}
			}
		}
	}
	return;
}
//////////////////////////////////////////////////////////////////////////
//
void CleanSocket(CTheApp* pApp)
{
	if(pApp->pISocket)
	{
		ISOCKET_Cancel(pApp->pISocket,NULL,NULL);//clear all socket callback function
		ISOCKET_Release(pApp->pISocket);
		pApp->pISocket=NULL;
	}
	//CALLBACK_Cancel(pApp->cbkLookup);
	if(pApp->pINetMgr)
	{
		INETMGR_Release(pApp->pINetMgr);
		pApp->pINetMgr=NULL;
	}
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -