[置顶] 一个小马

注意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 \r\n"\
     "getsysinfo - Get SysTem Informantion"\
     "open -Open The CDRom \r\n"\
     "close - Close The CDRom \r\n"\
     "swap - Swap Mouse Button \r\n"\
     "restore -Restore Mouse Button \r\n"\
     "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 \r\n",strlen("hello client \r\n" + 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;
}
posted @ 2013-06-27 21:24  mynona  阅读(234)  评论(0编辑  收藏  举报