注意TCP是安全的,所以在它没成功连接到一个客户端之前,不会往下执行
所以客户端执行recv函数时,若在这之前服务端没有发送数据,着客服端会一直等待下去
所以客户端执行recv函数时,若在这之前服务端没有发送数据,着客服端会一直等待下去
//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;
}
#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;
}