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

📄 serverfun.c

📁 Linux 上的socket嗅探器
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -