本质上socket无法传输结构体,我们只有将结构体装换为字节数组,或者是字符串格式来传输,到了服务端在强制类型转换一下即可,下面的代码分别提供原生写法与通过boost的实现两种,直接改改,可用于收集目标主机数据。
客户端:
#include <winsock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib")
typedef struct Info { char client_name[30]; char buffer[1024]; }message;
message msg;
void GetSysInfo() { SYSTEM_INFO sysInfo; }
int main() { WSADATA WSAData; SOCKET sock;
WSAStartup(MAKEWORD(2, 0), &WSAData); sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in ClientAddr; ClientAddr.sin_family = AF_INET; ClientAddr.sin_port = htons(15001); ClientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sock, (LPSOCKADDR)&ClientAddr, sizeof(ClientAddr));
char snd_buf[1024] = { 0 };
strcpy(msg.client_name, "lyshark"); strcpy(msg.buffer, "bbbbbb");
memcpy(snd_buf, &msg, sizeof(message)); send(sock, snd_buf, sizeof(snd_buf), 0);
closesocket(sock); WSACleanup(); return 0; }
|
服务端;
#include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") #define PORT 15001 #define ERROR 0 #define BUFFER_SIZE 1024
typedef struct Info { char client_name[30]; char buffer[1024]; }message;
int main() { WSADATA WSAData;
WSAStartup(MAKEWORD(2, 0), &WSAData);
SOCKET sock; sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in ServerAddr; ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(PORT); ServerAddr.sin_addr.s_addr = INADDR_ANY;
bind(sock, (LPSOCKADDR)&ServerAddr, sizeof(ServerAddr)); listen(sock, 10); SOCKET msgsock; char buf[1024] = { 0 };
msgsock = accept(sock, (LPSOCKADDR)0, (int *)0);
recv(msgsock, buf, sizeof(buf), 0); message *msg = (message*)buf;
printf("%s \n", msg->client_name); printf("%s \n", msg->buffer);
closesocket(sock); WSACleanup();
system("pause"); return 0; }
|