📄 net.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 + -