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