📄 serverfun.c
字号:
#endif
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Server is opened(port: %d, socket:%d) !",Servparam.iPort,Servparam.sd_listen);
return 1;
}
/********************************************************************
* void CloseSocketServer(void)
* Close Server's socket port
* Input void
* Output: void
* Return: 1-- Error,
********************************************************************/
int Server_Close(void)
{
int err;
int i=0,count=0;
fd_set allset;
REQLIST *lpuser=NULL;
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Wait for closing..");
/* Close all receive thread */
count=GetSocketUsercount();
for(i=0 ; i < count ;i++ )
{
lpuser=GetNextSocketUser();
if(lpuser!=NULL)
{
fd_set allset;
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Close Client: '%s' (%d)",lpuser->ClientAddr,lpuser->sd_accept);
if(Server_OnClientDisconnected!=NULL)
Server_OnClientDisconnected(lpuser);
lpuser->ifprocessrun=0;
#ifdef GTK_INCLUDE
#else
if(lpuser->pid)
{
kill(lpuser->pid,SIGTERM);
kill(lpuser->pid,SIGKILL);
lpuser->pid=0;
}
#endif
FD_ZERO(&allset);
FD_SET(lpuser->sd_accept,&allset);
closesocket(lpuser->sd_accept);
lpuser->sd_accept=0;
}
}
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Terminate server thread...");
Servparam.ifprocessrun=0;
#ifdef GTK_INCLUDE
#else
if(Servparam.server_AcceptPid)
{
kill(Servparam.server_AcceptPid,SIGTERM);
kill(Servparam.server_AcceptPid,SIGKILL);
Servparam.server_AcceptPid=0;
}
#endif
FreeAllSocketUser();
FD_ZERO(&allset);
FD_SET(Servparam.sd_listen,&allset);
closesocket(Servparam.sd_listen);
Servparam.sd_listen=0;
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Service is shutdown !");
return err;
}
/********************************************************************
* int AcceptThreadProc(LPVOID pParam)
* Accept procedure of SOCKET thread.
* Input void
* Output: void
* Return: 1-- Error,
********************************************************************/
void *Server_AnalysisPro(LPVOID );
void *Server_AcceptProc(LPVOID pParam)
{
SOCKET sd_accept;
struct sockaddr_in addr_client;
fd_set rset, allset;
unsigned int maxfd=0;
int nSize,nready;
REQLIST *lpuser=NULL;
SockServer_Param *lpApam=(SockServer_Param*)pParam;
maxfd=lpApam->sd_listen;
FD_ZERO(&allset);
FD_SET(lpApam->sd_listen,&allset);
while (lpApam->ifprocessrun)
{
int i, count=GetSocketUsercount();
for(i=0 ; i < count ;i++ )
{
lpuser=GetNextSocketUser();
if(lpuser!=NULL&&lpuser->ifprocessrun==0)
{
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Close Client: '%s' (%d)",lpuser->ClientAddr,lpuser->sd_accept);
if(Server_OnClientDisconnected!=NULL)
Server_OnClientDisconnected(lpuser);
lpuser->ifprocessrun=0;
#ifdef GTK_INCLUDE
#else
if(lpuser->pid)
{
kill(lpuser->pid,SIGTERM);
kill(lpuser->pid,SIGKILL);
lpuser->pid=0;
}
#endif
FD_ZERO(&allset);
FD_SET(lpuser->sd_accept,&allset);
FreeSocketUser(lpuser->sd_accept);
closesocket(lpuser->sd_accept);
lpuser->sd_accept=0;
}
}// for(i=0 ; i < count ;i++ )
rset=allset;
nready=select(maxfd+1,&rset,NULL,NULL,NULL);
nSize=FD_ISSET(lpApam->sd_listen,&rset);
if(nSize==0||nready<0)
continue;
nready--;
nSize = sizeof(addr_client);
memset((void*)(&addr_client),0,nSize);
sd_accept = accept(lpApam->sd_listen, (struct sockaddr *)(&addr_client), &nSize);
if (sd_accept == INVALID_SOCKET)
{
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Error %d,Accept error !", WSAGetLastError());
break;
}
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("client connecting..");
FD_SET(sd_accept,&allset);
if(sd_accept>maxfd)
maxfd=sd_accept;
/* here to use accept socket */
lpuser=MallocSocketUser(sd_accept);
if(lpuser==NULL)
{
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Client is full !");
closesocket(sd_accept);
sd_accept=0;
continue;
}
memcpy((void*)(&lpuser->addr_client),(void*)(&addr_client),sizeof(addr_client));
lpuser->sd_accept = sd_accept ;
sprintf(lpuser->ClientAddr , "%s", inet_ntoa(lpuser->addr_client.sin_addr));
ResetSrvclientData(lpuser);
lpuser->ifprocessrun=1;
lpuser->rcount=0;
lpuser->rpcount=0;
lpuser->wcount=0;
lpuser->wpcount=0;
lpuser->_ctime=lpuser->_vtime=time(0);
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("client '%s' (%d) connected!",lpuser->ClientAddr,lpuser->sd_accept);
if(Server_OnClientConnected!=NULL)
Server_OnClientConnected(lpuser);
#ifdef GTK_INCLUDE
pthread_create( &(lpuser->pid), NULL, Server_AnalysisPro,(LPVOID)lpuser);
#else
if((lpuser->pid=fork())>0)
{
}
else if(lpuser->pid==0)
{
/* I am child process */
Server_AnalysisPro(lpuser);
exit(1);
}
else
{
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Error, cann't create client thread !");
closesocket(sd_accept);
FreeSocketUser(sd_accept);
sd_accept=0;
}
#endif
}
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Quit accepting ..");
#ifdef GTK_INCLUDE
pthread_exit(NULL);
#endif
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Quit accepting OK!");
return NULL;
}
void *Server_AnalysisPro(LPVOID pParam)
{
REQLIST *lpuser=(REQLIST *)pParam;
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Enter Analysising...");
while (lpuser->ifprocessrun)
{
if(CheckSocketRead(lpuser->sd_accept,100)>0)
{
/* read the request THREAD WILL BLOCKING HERE !!! */
lpuser->recvlen=0;
lpuser->res=recv(lpuser->sd_accept, (char*)lpuser->request, MAXRECLEN, 0);
if (lpuser->res==INVALID_SOCKET)
{
lpuser->error=WSAGetLastError();
lpuser->ifprocessrun=0;
break;
}
else
lpuser->recvlen=lpuser->res;
/* if closing down, exit thread */
if (lpuser->recvlen==0 || lpuser->error==WSAECONNRESET || lpuser->error==WSAECONNABORTED)
{
lpuser->ifprocessrun=0;
break ;
}
/* add read data to chip ahces */
if(lpuser->recvlen>0)
{
lpuser->rpcount++;
lpuser->rcount+=lpuser->recvlen;
if(Server_OnRequestPro!=NULL)
{
int returnCmd=Server_OnRequestPro(lpuser, (unsigned char*)lpuser->request , lpuser->recvlen) ;
// added Cmd here
switch(returnCmd)
{
case 0:
{
lpuser->ifprocessrun=0;
}break;
};//switch(returnCmd)
}
} // if(lpuser->recvlen>0)
} // if(CheckSocketRead(lpuser->sd_accept,100)>0)
};//while(lpuser->ifprocessrun)
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Quit Analysising ...");
#ifdef GTK_INCLUDE
pthread_exit(NULL);
#endif
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Quit Analysising OK !");
return NULL;
}
int Server_SendToClient(REQLIST *lpuser, unsigned char *dest, int sendlen)
{
int ret=0;
if(lpuser!=NULL&&lpuser->sd_accept>0)
{
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Send to client,%d bytes...",sendlen);
lpuser->wpcount++;
lpuser->wcount+=sendlen;
lpuser->res=send(lpuser->sd_accept,(char*)(dest),sendlen, 0);
if (lpuser->res==INVALID_SOCKET)
{
lpuser->error=WSAGetLastError();
lpuser->ifprocessrun=0;
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Send to client error, client closed !");
}
else
{
if(Server_OnClientSend!=NULL)
Server_OnClientSend(lpuser,dest,sendlen);
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Send length= %d OK!",lpuser->res);
ret=lpuser->res;
}
}
return ret;
}
int Server_RemoveClient(REQLIST *lpuser)
{
int found=0,res,freei;
REQLIST *lpfound=NULL;
if(lpuser==NULL)
return 0;
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Remove client...");
res=GetSocketUsercount();
for(freei=0;freei<res;freei++)
{
lpfound=GetNextSocketUser();
if(lpfound==lpuser)
{
fd_set allset;
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Close Client: %s,%d",lpuser->ClientAddr,lpuser->sd_accept);
if(Server_OnClientDisconnected!=NULL)
Server_OnClientDisconnected(lpuser);
lpuser->ifprocessrun=0;
#ifdef GTK_INCLUDE
#else
if(lpuser->pid)
{
kill(lpuser->pid,SIGTERM);
kill(lpuser->pid,SIGKILL);
lpuser->pid=0;
}
#endif
FD_ZERO(&allset);
FD_SET(lpuser->sd_accept,&allset);
closesocket(lpuser->sd_accept);
FreeSocketUser(lpuser->sd_accept);
lpuser->sd_accept=0;
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Remove client ok!");
found=1;
break;
}
}
if(!found)
if(Server_OnDebugMessage!=NULL)
Server_OnDebugMessage("Client is not found!");
return found;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -