zoukankan      html  css  js  c++  java
  • [置顶] 一个小马

    注意TCP是安全的,所以在它没成功连接到一个客户端之前,不会往下执行

    所以客户端执行recv函数时,若在这之前服务端没有发送数据,着客服端会一直等待下去

    server.cpp


    //WSAStartup socket bind listen accept send/recv closesocket WSACleanup
    #include <winsock2.h>
    #include <stdio.h>
    #include <iostream>
    #include <windows.h>
    using namespace std;
    #pragma comment (lib,"ws2_32")
    #pragma comment (lib,"winmm")
    #define HELPMSG "help - Show Help Menu "
         "getsysinfo - Get SysTem Informantion"
         "open -Open The CDRom "
         "close - Close The CDRom "
         "swap - Swap Mouse Button "
         "restore -Restore Mouse Button "
         "exit -Quit BdShell"
    #define NAME_LEN 20
    typedef struct _SYS_INFO
    {
         OSVERSIONINFO OsVer;   //     保存操作系统信息
         char szComputerName[NAME_LEN]; //保存计算机名
         char szUserName[NAME_LEN]; //保存当前登录名
    }SYS_INFO,*PSYS_INFO;

    //用于处理命令
    bool Dispatch(SOCKET sock , char *szCmd);
    //获取系统相关信
    void GetSysInfo(SYS_INFO *sys_info);
    int main(int argc , char* grgv[])
    {
         WSADATA wsaData;
         WSAStartup(MAKEWORD(2,2),&wsaData);

         SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

         sockaddr_in addr;
         addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
         addr.sin_port = htons(827);
         addr.sin_family = PF_INET;

         bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

         listen(s,1);

         SOCKADDR clientAddr;
         int nSize = sizeof(SOCKADDR);
         SOCKET clientSock;

         clientSock = accept(s,(SOCKADDR*)&clientAddr,&nSize);

    //     send(clientSock,"hello client ",strlen("hello client " + sizeof(char)),NULL);

        
         while(TRUE)
         {
              //发送一个命令提示
              send(clientSock,"BdShell>",strlen("BdShell>") + sizeof(char),0);
              char buff[MAXBYTE] = {0};
              //接收客户端发来的命令
              recv(clientSock,buff,MAXBYTE,0);
              //cout<<"from client buff "<<buff<<endl;
              if(!strcmp(buff,"exit"))
                   break;
              //发布命令
              bool bRet = Dispatch(clientSock,buff);
              if( bRet == FALSE)
              {
                   send(clientSock,"Command Unsuccessfully!",strlen("Command Unsuccessfully!") + sizeof(char),0);
              }

         }

         closesocket(clientSock);
         closesocket(s);

         WSACleanup();
         return 0;
    }

    bool Dispatch(SOCKET sock , char *szCmd)
    {
         bool bRet = FALSE;

         //根据不同的命令,完成不同的功能
         if(!strcmp(szCmd,"help"))
         {
              send(sock,HELPMSG,strlen(HELPMSG) + sizeof(char),0);
              bRet = TRUE;
         }
         //获取系统信息
         else if(!strcmp(szCmd,"getsysinfo"))
         {
              SYS_INFO SysInfo = {0};
              GetSysInfo(&SysInfo);
              int n = send(sock,(const char *)&SysInfo,sizeof(SYS_INFO),0);
              if(SOCKET_ERROR == n)
              {
                   cout<<"错误代码"<<n<<endl;
              }
              bRet = TRUE;
         }
         //打开关驱
         else if(!strcmp(szCmd,"open"))
         {
              mciSendString("set cdaudio door open",NULL,NULL,NULL);
              bRet = TRUE;
         }
         //关闭光驱
         else if(!strcmp(szCmd,"close"))
         {
              mciSendString("set cdaudio door closed",NULL,NULL,NULL);
              bRet = TRUE;
         }
         //交换鼠标左右键功能
         else if(!strcmp(szCmd,"swap"))
         {
              SwapMouseButton(TRUE);
              bRet = TRUE;
         }
         //恢复鼠标左右键功能
         else if(!strcmp(szCmd,"restore"))
         {
              SwapMouseButton(FALSE);
              bRet = TRUE;
         }
         else
         {
         }

         return bRet;
    }


    void GetSysInfo(PSYS_INFO sys_info)
    {

        
         //OSVERSIONINFO OsVer;

         sys_info->OsVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
         GetVersionEx(&sys_info->OsVer);

         if(sys_info->OsVer.dwPlatformId == VER_PLATFORM_WIN32_NT)
         {
              if(sys_info->OsVer.dwMajorVersion == 5 && sys_info->OsVer.dwMinorVersion == 1)
              {
                   cout<<"Widows XP "<<sys_info->OsVer.dwMinorVersion<<endl;
              }else if(sys_info->OsVer.dwMajorVersion == 5 && sys_info->OsVer.dwMinorVersion == 0)
              {
                   cout << "Windows 2K"<<endl;
              }else
              {
                   cout<<"Other System"<<endl;
              }

              unsigned long nSize = NAME_LEN;
              GetComputerName(sys_info->szComputerName,&nSize);
              cout<<"Computer Name is "<< sys_info->szComputerName<<endl;

              nSize = MAXBYTE;
              GetUserName(sys_info->szUserName,&nSize);
              cout<< "User Name is "<<sys_info->szUserName<<endl;
                  
         }
        
    }

    client.cpp

    #include <stdio.h>
    #include <winsock2.h>
    #include <iostream>
    #include <conio.h>
    #include <string>
    using namespace std;
    #pragma comment (lib,"ws2_32")

    #define NAME_LEN 20
    typedef struct _SYS_INFO
    {
         OSVERSIONINFO OsVer;   //     保存操作系统信息
         char szComputerName[NAME_LEN]; //保存计算机名
         char szUserName[NAME_LEN]; //保存当前登录名
    }SYS_INFO,*PSYS_INFO;

    void ShowSysInfo(PSYS_INFO SysInfo)
    {
         if(SysInfo->OsVer.dwPlatformId == VER_PLATFORM_WIN32_NT)
         {
        
              if(SysInfo->OsVer.dwMajorVersion == 5 && SysInfo->OsVer.dwMinorVersion == 1)
                   cout<<"Window XP "<<SysInfo->OsVer.szCSDVersion<<endl;
              else if(SysInfo->OsVer.dwMajorVersion == 5 && SysInfo->OsVer.dwMinorVersion == 0)
                   cout<<"Windows 2K"<<endl;
         }else
              cout<<"Other System"<<endl;
         cout << "Computer Name is "<< SysInfo->szComputerName<<endl;
         cout << "User Name is "<<SysInfo->szUserName<<endl;
    }


    int main(int argc,char* argv[])
    {
         WSADATA wsaData;
         WSAStartup(MAKEWORD(2,2),&wsaData);

         SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

         sockaddr_in addr;
         addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
         addr.sin_family = PF_INET;
         addr.sin_port = htons(827);

         connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

         //char szBuffer[MAXBYTE] = {0};
         //recv(s,szBuffer,MAXBYTE,NULL);
         while(TRUE)
         {
              char Buff[MAXBYTE] = {0};
              char Cmd[MAXBYTE] = {0};

              recv(s,Buff , MAXBYTE,0);

              cin>>Cmd;
              cout<<"you input command is:"<<Cmd<<endl;
              send(s,Cmd,MAXBYTE,0);
              if( !strcmp(Cmd,"exit"))
              {
                   cout<<"Login out!"<<endl;
                   break;
              }
         //     recv(s,Buff,MAXBYTE,0);
              memset(Buff,0,MAXBYTE);         
              //cout<<"test test  test test test"<<Buff<<endl;
              if(!strcmp(Cmd,"getsysinfo"))
              {
                   recv(s,Buff,MAXBYTE,0);
                   PSYS_INFO SysInfo = (PSYS_INFO)Buff;
                   //cout<<SysInfo->OsVer.dwPlatformId<<"  "<<SysInfo->OsVer.dwMajorVersion<<SysInfo->OsVer.szCSDVersion<<endl;
                   ShowSysInfo(SysInfo);
              }else if(!strcmp(Cmd,"help"))
              {
                   recv(s,Buff,MAXBYTE,0);
                   cout<<Buff<<endl;
              }else
              {
              }
         }
         getch();
         WSACleanup();
         return 0;
    }
  • 相关阅读:
    mysql的启动出现错误 install/remove denied错误操作
    mybatis的开发方式
    mysql绿色版安装出现1067的错误原因
    线程池中对于异常的处理操作
    spring中的aync注解的使用与事务操作
    互联网金融产品经理 修炼之道
    几句牢骚
    做自己
    自动加载与访问权限
    mvc模式实现
  • 原文地址:https://www.cnblogs.com/mynona/p/3162644.html
Copyright © 2011-2022 走看看