当前位置: 首页 > news >正文

socket 传输结构体数据,另一端进行恢复

common.h


#pragma once#include <cstring>
#include <iostream>// 要传输的结构体
#pragma pack(push, 1)  // 不要添加任何填充,按 1 字节对齐
struct Person {int id;char name[32];float height;bool married;// 构造函数(可选)Person() : id(0), height(0.0f), married(false) {std::memset(name, 0, sizeof(name));}// 打包函数:将结构体序列化为字节数组void pack(char* buffer) const {std::cout << sizeof(Person) << std::endl;std::memcpy(buffer, this, sizeof(Person));}// 解包函数:从字节数组还原结构体void unpack(const char* buffer) {std::memcpy(this, buffer, sizeof(Person));}// 打印信息void print() const {std::cout << "ID: " << id<< ", Name: " << name<< ", Height: " << height<< ", Married: " << (married ? "Yes" : "No")<< std::endl;}
};#pragma pack(pop)// 固定大小,用于传输
static_assert(sizeof(Person) == 41, "Person struct size must be 41 bytes");

// serverreceiver.cpp


#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include "common.h"int main() {const int PORT = 8888;int server_sock, client_sock;struct sockaddr_in server_addr, client_addr;socklen_t client_len = sizeof(client_addr);server_sock = socket(AF_INET, SOCK_STREAM, 0);if (server_sock < 0) {std::cerr << "Socket creation failed\n";return -1;}int opt = 1;setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Bind failed\n";close(server_sock);return -1;}if (listen(server_sock, 1) < 0) {std::cerr << "Listen failed\n";close(server_sock);return -1;}std::cout << "Waiting for connection...\n";client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_len);if (client_sock < 0) {std::cerr << "Accept failed\n";close(server_sock);return -1;}std::cout << "Client connected.\n";// 接收结构体char buffer[sizeof(Person)];ssize_t received = recv(client_sock, buffer, sizeof(Person), 0);if (received == sizeof(Person)) {Person person;person.unpack(buffer);std::cout << "Received: ";person.print();} else {std::cerr << "Receive failed or incomplete data\n";}close(client_sock);close(server_sock);return 0;
}

clientsender.cpp


#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include "common.h"int main() {const char* SERVER_IP = "127.0.0.1";const int PORT = 8888;int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock < 0) {std::cerr << "Socket creation failed\n";return -1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Connect failed\n";close(sock);return -1;}std::cout << "Connected to receiver.\n";// 创建结构体实例Person person;person.id = 1001;std::strcpy(person.name, "Alice");person.height = 1.68f;person.married = true;person.print();  // 打印发送的内容// 发送结构体char buffer[sizeof(Person)];person.pack(buffer);ssize_t sent = send(sock, buffer, sizeof(Person), 0);if (sent == sizeof(Person)) {std::cout << "Person struct sent successfully.\n";} else {std::cerr << "Send failed\n";}close(sock);return 0;
}

http://www.dtcms.com/a/473783.html

相关文章:

  • 2025年数据治理平台解决方案:让数据真正可用、可信、可运营
  • 网站建设公司 长春广州购物网站建设
  • Linux ARM QT FrameBuffer
  • 静态网站特点阿里云wordpress在哪里设置
  • MATLAB完整问卷调查数据分析(附完整代码)
  • Claude Code学习笔记(四)-助你快速搭建首个Python项目
  • 济南 制作网站 公司哪家好文登seo排名
  • Chrome 插件开发入门
  • 天津专业网站制作wordpress 多域名登陆
  • Docker简介及部署
  • 字符数组和字符串
  • 【TIDE DIARY 3】dify: chatflow; docker: exec
  • Docker Compose学习
  • 从iBizPMS到iBizPLM:一场研发管理平台的四年级架构革命
  • KingbaseES SQL Server模式扩展属性管理:三大存储过程实战指南
  • 5118网站怎么做的登录贵州省住房和城乡建设厅网站
  • 开源 C++ QT QML 开发(十六)进程--共享内存
  • 密码学系列 - 零知识证明(ZKP) - MSM运算
  • 厦门网站制作推广友链是什么
  • 大的网站建设公司好赣州章贡区最新招聘信息
  • 总结Vue.js等成功项目的生态建设经验
  • 西安北郊网站开发wordpress上传附件
  • mysql读写分离中间件——Atlas详解
  • jndi使用druid,在tomcat中配置druid监控
  • tomcat 默认编码的设置
  • 【mybatisPlus详解】
  • 回归与分类算法全解析:从理论到实践
  • 什么是 Qt 的元对象系统?
  • 【LeetCode】68. 文本左右对齐
  • 第十九周周报