初学者必看 C++简单的主机间的通信并获取服务器端的Sysinfo信息

来源:互联网 发布:直播视频录制软件 编辑:程序博客网 时间:2024/06/05 18:24

主机间的通信

1,获取Server的Sysinfo信息并发送给Client

2,Server与Client可以纯文字聊天






Server 端:

#include<winsock2.h>#include <windows.h>#include <tchar.h>#include <stdio.h>#include<iostream>#include <VersionHelpers.h>#include <string.h>#pragma comment (lib,"ws2_32")using namespace std;TCHAR* envVarStrings[] ={TEXT("Description     "),TEXT("OS         = %OS%"),TEXT("PATH       = %PATH%"),TEXT("HOMEPATH   = %HOMEPATH%"),TEXT("TEMP       = %TEMP%")};#define  ENV_VAR_STRING_COUNT  (sizeof(envVarStrings)/sizeof(TCHAR*))#define INFO_BUFFER_SIZE 1000#define MIN_INFO_BUFFER_SIZE 50typedef struct MyStruct                                           //SysInfo结构体声明{TCHAR Os[MIN_INFO_BUFFER_SIZE];TCHAR CName[MIN_INFO_BUFFER_SIZE];TCHAR UserName[MIN_INFO_BUFFER_SIZE];TCHAR SysDir[INFO_BUFFER_SIZE];TCHAR WinDir[INFO_BUFFER_SIZE];TCHAR Envir[ENV_VAR_STRING_COUNT][1000];}dSysInfo,*pdSysInfo;void printError(TCHAR* msg);dSysInfo SysInfo;void getSysInfo()                                                        //获取服务器端SysInfo信息并存入结构体{strcpy_s(SysInfo.Os, "Os:");strcpy_s(SysInfo.CName, "ComputerName:");strcpy_s(SysInfo.UserName, "UserName:");strcpy_s(SysInfo.SysDir, "SystemDirectory:");strcpy_s(SysInfo.WinDir, "WindowsDirectory:");strcpy_s(SysInfo.Envir[0], ("\n\nSmall selection of Environment Variables:"));TCHAR  infoBuf[INFO_BUFFER_SIZE];TCHAR  mininfoBuf[MIN_INFO_BUFFER_SIZE];DWORD  bufCharCount = INFO_BUFFER_SIZE;DWORD i;// Get and display the name of the computer. bufCharCount = INFO_BUFFER_SIZE;if (IsWindowsXPOrGreater())                                                          //获取系统版本信息{if (IsWindowsVistaOrGreater()){if (IsWindows7OrGreater()){if (IsWindows8OrGreater()){if (IsWindows8Point1OrGreater()){strcat_s(SysInfo.Os, "Windows8.1\n");}else strcat_s(SysInfo.Os, "Windows8\n");}else strcat_s(SysInfo.Os, "Windows7\n");}else  strcat_s(SysInfo.Os, "Vista\n");}else strcat_s(SysInfo.Os, "XP\n");}bufCharCount = MIN_INFO_BUFFER_SIZE;GetComputerName(mininfoBuf, &bufCharCount);                                             //获取主机Namestrcat_s(SysInfo.CName, MIN_INFO_BUFFER_SIZE, mininfoBuf);// Get and display the user name. bufCharCount = MIN_INFO_BUFFER_SIZE; if (GetUserName(mininfoBuf, &bufCharCount)){                                           //获取用户名strcat_s(SysInfo.UserName, mininfoBuf);}else printf("getUserName error!");// Get and display the system directory. if (GetSystemDirectory(infoBuf, INFO_BUFFER_SIZE)){                                 strcat_s(SysInfo.SysDir, infoBuf);}// Get and display the Windows directory. if (GetWindowsDirectory(infoBuf, INFO_BUFFER_SIZE)){strcat_s(SysInfo.WinDir, infoBuf);}for (i = 1; i < ENV_VAR_STRING_COUNT + 1; ++i){ExpandEnvironmentStrings(envVarStrings[i], infoBuf,INFO_BUFFER_SIZE);strcpy_s(SysInfo.Envir[i], infoBuf);}}int main(int argc,char * argv[]){char a;getSysInfo();WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);                                //套接字s用于监听sockaddr_in sockaddr;sockaddr.sin_family = PF_INET;sockaddr.sin_addr.S_un.S_addr = inet_addr("192.168.26.128");sockaddr.sin_port = htons(827);bind(s, (SOCKADDR*)&sockaddr, sizeof(sockaddr));                                     //绑定套接字 ip,端口号 char szBuffer[MAXBYTE] = {0};char szBufferAccpet[MAXBYTE] = { 0 };  SOCKADDR clientAddr = {0};int nSize = sizeof (SOCKADDR);SOCKET clientSock;listen(s, 1);                                                                      //进行监听clientSock = accept(s, (SOCKADDR*)&clientAddr, &nSize);                           //接受客户端的TCP请求//套接字clientSock 用于发送//send(clientSock, "Hello client \r\n", strlen("Hello client \r\n") + sizeof(char), NULL);send(clientSock, (const char *)&SysInfo, sizeof(dSysInfo), 0);                    //给客户端发送SysInfo结构体printf("I'm Server\r\n");while (TRUE){                                                                       //与客户端进行文字通信recv(clientSock, szBufferAccpet, MAXBYTE, NULL);cout<<"Client:"<<szBufferAccpet<<endl;cout << "Server:";gets_s(szBuffer);send(clientSock,szBuffer, strlen(szBuffer) + sizeof(char), NULL);}closesocket(clientSock);closesocket(s);WSACleanup();cin >> a;return 0;}
Client:


#include<iostream>#include<winsock2.h>#pragma comment (lib,"ws2_32")using namespace std;#define  ENV_VAR_STRING_COUNT  (sizeof(envVarStrings)/sizeof(TCHAR*))#define INFO_BUFFER_SIZE 1000#define MIN_INFO_BUFFER_SIZE 50TCHAR* envVarStrings[] ={TEXT("Description     "),TEXT("OS         = %OS%"),TEXT("PATH       = %PATH%"),TEXT("HOMEPATH   = %HOMEPATH%"),TEXT("TEMP       = %TEMP%")};typedef struct MyStruct                          //用于保存Sysinfo并发送给客户端的结构体{TCHAR Os[MIN_INFO_BUFFER_SIZE];TCHAR CName[MIN_INFO_BUFFER_SIZE];TCHAR UserName[MIN_INFO_BUFFER_SIZE];TCHAR SysDir[INFO_BUFFER_SIZE];TCHAR WinDir[INFO_BUFFER_SIZE];TCHAR Envir[ENV_VAR_STRING_COUNT][1000];}dSysInfo, *pdSysInfo;void showInfo(pdSysInfo SysInfo){                 //用于显示服务器端发来的SysInfo信息cout << SysInfo->Os << endl;cout << SysInfo->UserName << endl;cout << SysInfo->CName << endl;cout << SysInfo->SysDir << endl;cout << SysInfo->WinDir << endl;for (int i = 0; i < ENV_VAR_STRING_COUNT; i++){cout << SysInfo->Envir[i] << endl;}}int main(int argc, char * argv[]){   char a;WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);                 //创建套接字sockaddr_in sockAddr;sockAddr.sin_family = PF_INET;sockAddr.sin_addr.S_un.S_addr = inet_addr("192.168.26.128");sockAddr.sin_port = htons(827);char szBufferAccpect[MAXBYTE] = { "NULL" };                             //接收服务器端发来的消息储存变量char szBuffer[MAXBYTE] = { "NULL" };char szBuffer1[65595] = { "NULL" };printf("I'm Client\r\n");cout << "Server:" << endl;connect(s,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));                     //给服务器端发送TCP链接请求memset(szBuffer1, 0, 65595);recv(s, szBuffer1, 65595, 0);                                        //接收服务器端发来的SysInfo结构体pdSysInfo SysInfo = (pdSysInfo)szBuffer1;showInfo(SysInfo);cout << "Client:";while (TRUE){                                                         //与服务器端进行文学通信gets_s(szBuffer);send(s, szBuffer, strlen(szBuffer) + sizeof(char), NULL);recv(s, szBufferAccpect, MAXBYTE, NULL);cout<<"Server:"<<szBufferAccpect<<endl;cout << "Client:";}closesocket(s);WSACleanup();cin>>a;return 0;}


0 0
原创粉丝点击