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;
}
C/C++ 通过Socket 传输结构体的更多相关文章
- C#与C++通过socket传送结构体
C#服务端: using System; using System.Net.Sockets; using System.Net; using System.IO; using System.Diagn ...
- C与C# socket 跨平台通讯传输结构体
最近需要写一个C组成的服务器端与C#的客户端进行交互的软件,刚开始写的时候发现C#端解析时候出现了故障,经过仔细研究后发现原因是发送方传输太快,出现了所谓粘包的现象.也就是在C#端的Receive() ...
- socket发送结构体
struct send_info {char info_from[20]; //发送者IDchar info_to[20]; //接收者IDint info_length; //发送的消息主体的长度c ...
- Linux C Socket编程发送结构体、文件详解及实例
利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.c ...
- C# Socket 入门4 UPD 发送结构体(转)
今天我们来学 socket 发送结构体 1. 先看要发送的结构体 using System; using System.Collections.Generic; using System.Text; ...
- 2. socket结构体——表示socket地址
一.两种通用socket结构体 1. sockaddr struct sockaddr { sa_family_t sa_family; // 地址族 char sa_data[14]; // 存放s ...
- struct socket结构体详解
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://weiguozhihui.blog.51cto.com/3060615/15852 ...
- Socket 结构体
proto socket 关联结构: { .type = SOCK_STREAM, .protocol = IPPROTO_TCP, .prot = &tcp_prot, .ops = &am ...
- java socket传送一个结构体给用C++编写的服务器解析的问题
另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...
- socket编程相关的结构体和字节序转换、IP、PORT转换函数
注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...
随机推荐
- wscat 命令报错
使用wscat测试连接时报错: [root@kafka kafka-logs]# wscat ws://xxx.xxx.com/bs /usr/lib/node_modules/wscat/node_ ...
- 在原生 html 中使用 vue,在浏览器中直接运行 .vue 文件,在 vue 中使用 leaflet
vue3-in-html 在html中使用vue3,不依赖nodejs和webpack,不依赖脚手架 demo源码 https://gitee.com/s0611163/vue3-in-html 功能 ...
- 数字U家,即刻出发!2022联合利华黑客马拉松启动!
2022联合利华黑客马拉松火热报名倒计时! 欢迎各领域的个人及组织团队参与 人工智能.数据挖掘.市场规模预测.原材料与包装风险控制.AR/VR.低碳.消费者偏好研究等超多创新赛题,任选其一. 作为快消 ...
- 2017年第八届 蓝桥杯B组C/C++决赛题目
部分题目示意图来自网络,所以会带水印 最后编辑时间: 2021年5月12日 统一声明 如果不写默认带有常用头文件 如果不表明主函数默认表示在 void solve(){} 默认使用 using nam ...
- git速查
- Keep English Level-04
firm -- 坚定的,坚固的;公司 share -- n 股份,份额 executive -- 执行官 There is no chance,no density,no fate,that can ...
- crypto常用算法
欧几里得算法(辗转相除法) def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) 扩展欧几里得算法 def ext_euclid( ...
- 【Kafka系列】(一)Kafka入门
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 Kafka是什么? 一句话概括:Apache K ...
- [转帖]redis-benchmark的使用总结
redis-benchmark的使用总结 Redis简介: 测试需求: 测试环境架构 测试工具Redis-benchmark 1 redis-benchmark使用方法 参数的作用 2 测试查看 测试 ...
- [转帖]Shell 判断文件或文件夹是否存在(不存在则创建)
目录 1. 文件夹不存在创建文件夹 2. 判断文件夹是否存在 3. 判断文件是否存在 4. 常用的文件比较符 1. 文件夹不存在创建文件夹 if [ ! -d "/data/" ] ...