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

📄 net.c

📁 brew中个人开发的一个两国军棋游戏
💻 C
字号:
#include "net.h"
//////////////////////////////////////////////////////////////////////////
//打开连接
//////////////////////////////////////////////////////////////////////////
void OpenConnection(CJunQi* pApp)
{
     int nRet;

     pApp->nNetstate = NETSTATE_CONNECT;	//网络为连接状态

     pApp->pISocket = INETMGR_OpenSocket(pApp->pINetMgr, AEE_SOCK_STREAM);

     if (!pApp->pISocket)
     {
          int nErr = ISOCKET_GetLastError(pApp->pISocket);
          ISHELL_CloseApplet(pApp->a.m_pIShell, FALSE);
     }

     //Connect to the server
     pApp->nodeINAddr = ConvertToINAddr(HOST_ADDR);
     nRet = ISOCKET_Connect(pApp->pISocket, pApp->nodeINAddr,
        AEE_htons(HOST_PORT), ConnectCallBack, (void*)pApp); 

     //If we have an error on connection, quit
     if (nRet && (nRet != AEE_NET_WOULDBLOCK))
     {
          int nErr = ISOCKET_GetLastError(pApp->pISocket);
          ISHELL_CloseApplet(pApp->a.m_pIShell, FALSE);
     }
     else if (nRet != AEE_NET_WOULDBLOCK)
     {
          pApp->nNetstate = NETSTATE_OK;
     }

}

//////////////////////////////////////////////////////////////////////////
//连接操作成功或失败时,调用的回调函数
//////////////////////////////////////////////////////////////////////////
void ConnectCallBack(void * pUser, int nError)
{
	CJunQi* pApp = (CJunQi*)pUser;
	
	if (nError)
	{
		if (nError < AEE_NET_ENETISCONN)
		{
			int nErr = ISOCKET_GetLastError(pApp->pISocket);
			ISHELL_CloseApplet(pApp->a.m_pIShell, FALSE);
			return;
		}
	}
	else
		pApp->nNetstate = NETSTATE_OK;
}

//////////////////////////////////////////////////////////////////////////
//关闭连接
//////////////////////////////////////////////////////////////////////////
void CloseConnection(CJunQi* pApp)
{
	if (pApp->pISocket)
	{
		ISOCKET_Release(pApp->pISocket);
		pApp->pISocket = NULL;
	}
	
	pApp->nNetstate = NETSTATE_OK;
}

//////////////////////////////////////////////////////////////////////////
//转换成内部网址
//////////////////////////////////////////////////////////////////////////
INAddr ConvertToINAddr(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;    // Invalid address

   return ul;
}




//////////////////////////////////////////////////////////////////////////
//发送命令
//////////////////////////////////////////////////////////////////////////
boolean SendCommand(CJunQi* pApp, char* sCommond)
{
     int nRet;
	 uint16 nCharCount;

     pApp->nNetstate = NETSTATE_WRITE;	//发送字符状态
     
	 nCharCount = STRLEN(sCommond);		//求出要发送的字符串个数

     if (!pApp->pISocket)
          return TRUE;

     //Cancel callback and write data to server
     ISOCKET_Writeable(pApp->pISocket, NULL, NULL);
	 
     nRet = ISOCKET_Write(pApp->pISocket, (char*)sCommond, nCharCount);

     if (nRet == AEE_NET_ERROR)
     {
          int nErr = ISOCKET_GetLastError(pApp->pISocket);
          ISHELL_CloseApplet(pApp->a.m_pIShell, FALSE);
          return FALSE;
     }

     //We are not done sending bytes
     if (nRet == AEE_NET_WOULDBLOCK)
     {
          //If this call blocks, assign callback
          ISOCKET_Writeable(pApp->pISocket, WriteCallBack, (void*)pApp);
     }
     else
     {
          pApp->nNetstate = NETSTATE_OK;

          //If the game is over, kill the socket
          //if (pApp->nMove >= CONDITION_LOST)
          //    CloseConnection(pApp);

          return TRUE;
     }

     return FALSE;
}

//////////////////////////////////////////////////////////////////////////
//发送命令回调
//////////////////////////////////////////////////////////////////////////
void WriteCallBack(void *pUser)
{
     CJunQi* pApp = (CJunQi*)pUser;

     //If we have successfully written a packet
     //then update the screen and read
     if (SendCommand(pApp, (char *) pApp->m_PacketChar))
     {
          //tictacclient_DrawScreen(pApp);
          IDISPLAY_Update(pApp->a.m_pIDisplay);
		  ReceivedCommand(pApp,pApp->m_PacketChar,MAXLEN+1);
          //tictacclient_ReadMove(pApp);
     }
}


//////////////////////////////////////////////////////////////////////////
//从网络中读取数据
//////////////////////////////////////////////////////////////////////////
int ReceivedCommand(CJunQi* pApp,char *readline,int maxlen)
{
   int nRet,n;
   char c;
   pApp->nNetstate = NETSTATE_READ;

   	for (n=1; n<maxlen; n++)
    {
		//Cancel callback and read data from server
		ISOCKET_Readable(pApp->pISocket, NULL, NULL);

        if ( (nRet = ISOCKET_Read(pApp->pISocket, &c, sizeof(char) ) ) > 0 )	//任意正数,指示已成功读入所提供缓冲区的字节数
        {
            *readline++ = c;
            if (c=='\n')
				break;
        }
        else if (nRet == 0)	//不再有要接收的数据,且对等端已断开连接
        {
            if (n == 1)		//
                return 0;
            else			
                break;
        }
        else if(nRet == AEE_NET_WOULDBLOCK)
		{
			//If this call blocks, assign callback
			ISOCKET_Readable(pApp->pISocket, ReadCallBack, (void*)pApp);
			
		}
		else if(nRet == AEE_NET_ERROR)		/* Error */
		{   
			ISHELL_CloseApplet(pApp->a.m_pIShell, FALSE);
			return -1;  
		}
    }
	
    *(readline-1) = '\0';
    return n;
	
}

//////////////////////////////////////////////////////////////////////////
//从网络中读取数据回调函数
//////////////////////////////////////////////////////////////////////////
void ReadCallBack(void *pUser)
{
     CJunQi* pApp = (CJunQi*)pUser;

     //If we have successfully read data
     //from the server, we are done with this turn
     if (ReceivedCommand(pApp,pApp->m_PacketChar,MAXLEN+1))
     {
		 //tictacclient_DrawScreen(pApp);
		 //IDISPLAY_Update(pApp->a.m_pIDisplay);
     }
}

⌨️ 快捷键说明

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