C/C++ 通過Socket 傳輸結構體


本質上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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM