c语言自定义tcp协议实现socket通信(windows版本)

2023-05-16

    前面一篇博客介绍了mac/linux下通过C语言自定义协议实现socket通信的示例,因为大部分api与windows还有很多区别,这里就特意把windows下的tcp通信实例给介绍一下。

    无论是linux,还是windows,其实c语言都是默认小端序,这个需要注意,还有一个就是结构体的内存对齐问题也是存在的,所以协议结构体我们需要注意他的大小就行了,在进行拷贝的时候,不能直接使用sizeof来计算发送数据的长度。

    因为是windows,所以我们可以通过网络小助手来模拟一个服务端,而不需要通过netcat指令了,其实都一样,我的windows专业版好像不支持netcat也就是nc,当你运行nc指令,系统会默认把他干掉,很遗憾。

    协议中最重要的部分,就是数据体,这个部分严格来说会不一样,这里结合了cJSON这个库来做数据json格式化。借助了rand函数来做一个随机数。所以会比上一个示例复杂一些。

    这里多说一句,就是cJSON这个库是开源免费的,可以直接将头文件和cpp源文件加入项目中就可以使用了。

    show me the code:

#include <winsock.h>
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include "cJSON.h"
#pragma comment(lib,"ws2_32.lib")
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
#define PAYLOAD_SIZE 1024
typedef struct _pktdata{
	uint16_t flag;    //帧头标识符 0x5aa5
	uint16_t version; //版本       0x0001
	uint16_t type;    //类型       0x0001
	uint16_t reserved; //保留位    0xffff
	uint32_t length;   //数据长度  int
	uint8_t payload[PAYLOAD_SIZE];//数据体 可变长度
	uint8_t checksum;  //校验位  本例中没有设置
}pktdata;
void createPacket(pktdata* data){
	data->flag = (0x5aa5);
	data->version = (0x0001);
	data->type = (0x0001);
	data->reserved = (0xffff);
	//build payload
	cJSON* root = cJSON_CreateObject();
	int random = rand();
	char name[20];
	sprintf(name,"xxx%d",random);
	cJSON_AddItemToObject(root,"name",cJSON_CreateString(name));
	cJSON_AddItemToObject(root,"age",cJSON_CreateNumber(18));
	char* payload = cJSON_PrintUnformatted(root);
	data->length = strlen(payload);//25 -> {"name":"admin","age":18}
	printf("%s\n",payload);
	memcpy(data->payload,payload,data->length);
}
int main(int argc,char** argv){
	srand((unsigned)time(NULL));
	WORD sockVersion = MAKEWORD(2,2);
	WSADATA data;
	if(WSAStartup(sockVersion,&data)!=0){
	    return 0;
	}
	printf("start up.\n");
	SOCKET sclient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(sclient==INVALID_SOCKET){
		printf("invalid socket!\n");
	    return 0;
	}
	struct sockaddr_in servAddr;
	servAddr.sin_family = AF_INET;
	servAddr.sin_port = htons(6666);
	servAddr.sin_addr.S_un.S_addr = inet_addr("172.16.5.33");
	if(connect(sclient,(struct sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR){
		printf("connect error!\n");
		closesocket(sclient);
		return 0;
	}

	for(int i=0;i<10;i++){
		pktdata pd;
		createPacket(&pd);
		char sendData[1040] = {0};
		//strlen() = 3 是因为字符串数组中有0,这里不能使用strlen()来求字符串长度
		int len = pd.length + 12;
		memcpy(sendData,(void *)&pd,len); //? 如果拷贝struct _pktdata的长度,会是一个1040的长度,所以取的是payload数据长度+其余字段除去checksum长度
		send(sclient,sendData,len+1,0);//发送的时候多发送一位,是为了保证有一位留给校验位,虽然没有给它设置值
		Sleep(10);
	}
	closesocket(sclient);
	WSACleanup();
	printf("done!\n");
    return 0;
}

    这个代码,我是在visual c++6.0编辑器中运行的,同样的,在运行之前,先开启一个tcp server,这里使用网络小助手来模拟,监听本机6666端口。

    控制台打印的10条payload数据:

     

    小助手收到的数据hex表示:

    

    这里数据长度会发生变化,这是模拟的一个变化的数据体,无论怎么变化,我们都需要根据这个长度去求取数据体payload的内容。数字类型也都是小端序,高位在后,低位在前,我们在计算他们真实值的时候需要注意,尤其是服务端使用java来编码的时候。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言自定义tcp协议实现socket通信(windows版本) 的相关文章

  • react+antd动态表单以及数组对象示例

    在实际开发中 xff0c 我们会遇到表单中有些数据项是多个 xff0c 并不是普通的一个值 xff0c 或者一组值 xff0c 而是一个数组 xff0c 比如联系人这一项 xff0c 我们通常会有多个联系人 xff0c 这时候 xff0c
  • notepad++安装c/c++简单编程开发环境

    notepad 43 43 作为一个常用的编辑器 xff0c 加上一些插件可以很方便的作为一个简易的编译运行环境 xff0c 说是简易 xff0c 是因为运行简单的程序或者demo可以很方便 xff0c 如果大型的项目 xff0c 还是通过
  • 去掉webpack脚手架构建的vue项目中的eslint检查

    eslint是一个语法格式检测的工具 xff0c 对于规范开发有好处 xff0c 培养严格的书写习惯 xff0c 但是对于新手来说 xff0c 非常的痛苦 xff0c 有时候没有语法错误 xff0c 仅仅是格式中tab space区分不严格
  • Vue中百度地图的应用

    百度地图对于vue项目也做了依赖 xff0c 他就是vue baidu map xff0c 我们在vue项目中 xff0c 只需要安装vue baidu map依赖即可使用 xff0c 另外 xff0c 百度地图javascript api
  • React Hook “useState“ is called in function “xxx“ which is neither a React function component or解决办法

    如题所示 xff0c 在React开发中 xff0c 我们会自定义一些函数 xff0c 比如hook函数 xff0c 或者组件 xff0c 当我们使用了useState useEffect等这些hook函数的时候 xff0c 可能会报错 x
  • electron+vue项目安装vue-devtools插件

    这里记录一下自己安装过程中遇到的问题 xff1a 1 首先需要安装vue devtools xff0c 遇到了源码编译构建的时候的webpack webpack cli反复提示缺失的问题 这个问题很烦 a git clone https g
  • vue+vuetify表格控件v-data-table使用自定义列渲染

    这里先说明一下vue项目中使用vuetify框架进行整合的办法 xff1a 1 加入依赖 npm install vuetify save 2 加入开发依赖 npm install sass sass loader deepmerge sa
  • vue+vuetify构建简单消息确认框

    vue框架自己好像没有弹出框 xff0c 而vuetify有弹出框v dialog xff0c 没有确认框confirm xff0c 虽然确认框本身就是弹出框 xff0c 但是弹出框的功能有个特点 xff0c 就是确定做一件事情 xff0c
  • docker-compose构建mysql服务

    docker安装mysql服务显得很快捷 xff0c 我们如果使用了docker compose那就更快了 xff0c 我们只需要按照我们的要求 xff0c 设置相应的端口映射 xff0c 如果有需求 xff0c 也可以设置数据映射 配置如
  • Nginx核心模块内置变量

    本文根据Nginx官网整理了Nginx的ngx http core module模块的内置变量 xff0c 可与Apache做对比参考 随后做了一次测试观察各变量的值 xff0c 并附上测试结果 1 变量列表 arg name 请求行中参数
  • js属性名用变量代替

    在前端中 xff0c 我们有时候需要利用变量名来设置属性名 xff0c 虽然不是很常见 xff0c 但是也是一个应用场景 这时候 xff0c 我们如果想当然的 xff0c 直接使用变量来设置 xff0c 那么可能不会达到我们想要的结果的 我
  • nodejs利用ffi库调用windows系统user32库函数获取桌面程序窗口大小

    ffi库是npm提供的操作windows系统库函数的依赖库 xff0c 安装过程会比较麻烦 xff0c 需要编译 xff0c 可能需要npm全局安装windows build tools xff0c 如何安装 xff0c 可以参照这里 这篇
  • nodejs利用ffi库调用windows系统user32函数模拟用户登录操作

    如题所示 xff0c 一般的桌面程序 xff0c 用户登录很简单 xff0c 就是找到用户名和密码输入框 xff0c 输入相应的用户名和密码 xff0c 然后点击 登录 按钮 xff0c 完成登录操作 这是人为操作的步骤 xff0c 如果这
  • 通过vue指令创建electron-vue模板项目出现一直“downloading template“问题

    今天试了一下 xff0c vue init simulatedgreg electron vue vueapp的时候 xff0c 在命令行下一直downloading template xff0c 让我很懊恼 原来vue init创建的时候
  • electron-vue与vuetify整合出现报错:If you‘re seeing “$attrs is readonly“

    如题所示 xff0c 正常情况下electron vue与vuetify的整合 xff0c 因为就是vue与vuetify的整合 xff0c 按照一般的推荐方法 xff0c 基本不会出错 xff0c 但是 xff0c 这里因为electro
  • VISA编程实例(C实现)

    今天写这个文章 xff0c 是因为自己工作中用到了ROHDE amp SCHWARZ xff08 即罗德 施瓦茨公司 xff09 的仪表设备 xff0c 需要通过编程的方式来读取仪表上功率测试结果 xff0c 本来仪表上显示了测试结果 xf
  • mac下通过gcc命令手动编译动态链接库示例

    编译动态链接库 xff0c windows linux mac平台各不相同 xff0c 从文件上来说 xff0c windows下是dll xff0c linux下是so xff0c mac下是dylib xff1b 命令上也会有区别 xf
  • c++中char[]与char*的转换以及char*与数字互转

    在c c 43 43 中 xff0c 字符串操作不可避免 xff0c 而且通常 xff0c char 或者char 就能表示字符串 xff0c 这个跟java语言有很大的差别 xff0c java中char是字符 xff0c string才
  • electron项目构建打包缺少dll文件的问题解决办法

    最近 xff0c 在做electron项目中 xff0c 使用了第三方dll xff0c 开发环境运行一切正常 xff0c 可是当我们打包 xff0c 最后生成的可执行程序再执行 xff0c 发现调用dll总是不成功 xff0c 猜测是少了
  • c/c++中的回调函数

    c c 43 43 中的回调函数是一个很奇怪的东西 xff0c 在java中 xff0c 方法调用的时候 xff0c 参数最多可以传入另一个对象实例 xff0c 然后在方法体内 xff0c 调用实例的方法 xff0c 做不到方法调用的时候

随机推荐

  • 在Windows下配置多个git账号

    本文记录在Windows下配置两个github账号的过程 1 生成并部署SSH key 安装好Git客户端后 xff0c 打开git bash xff0c 输入以下命令生成user1的SSH Key xff1a ssh keygen t r
  • windows命令行下通过cl命令编译动态链接库示例

    一般在windows下写一个c c 43 43 的动态链接库 xff0c 我们都是在visual studio或着visual c 43 43 这些ide里面进行编译和生成的 xff0c 今天介绍 xff0c 如何通过命令行来实现手动编译和
  • gdb命令调试c程序

    一般开发c语言程序 xff0c 都是在ide中编码 xff0c 调试也是使用集成环境 xff0c 有时候 xff0c 我们的程序是在文本编辑器中编写的 xff0c 这时候可能使用gcc编译 xff0c 然后运行可执行程序 遇到需要调试的场景
  • 选择排序算法与示例详解(c语言)

    选择排序是排序算法的一种 xff0c 思想就是 xff0c 每一轮寻找数组中最大的值或者最小的值 xff0c 放在头部或者放入一个新的数组 这样经历一轮遍历 xff0c 数组或者新数组就是排好序的 xff0c 他的目的很明确 xff0c 每
  • 2020年csdn盘点

    十年前就注册了csdn账号 xff0c 之后一直没有写过博客 xff0c 都是看别人的博客 xff0c 等到2015年左右发表了第一篇自己的博客 xff0c 直到2016年底觉着做技术的就需要记录自己的博客 xff0c 不仅是自己学习的过程
  • chrome浏览器安装react-devtools

    react devtools是react开发时的一个浏览器插件 xff0c 对于各大主流高级浏览器都有扩展程序可以安装 xff0c 官方的地址默认是https github com facebook react devtools xff0c
  • react+typescript项目构建

    react项目构建可以很简单 xff0c 但是如果是结合typescript xff0c 其实也不是很麻烦 xff0c 官网也有很明确的说明 有两种办法 xff1a 1 直接构建带有typescript的react项目 xff0c 我们需要
  • react项目启动报错:Uncaught TypeError: Cannot read property ‘forEach‘ of undefined

    如题 xff0c react项目启动报错 xff0c 具体信息 xff0c 如下所示 xff1a 这个问题是因为浏览器安装了react devtools扩展程序导致的 xff0c 很多人的解决办法就是直接禁用react devtools x
  • react组件之间传值

    看过一些文章介绍react组件之间传值 xff0c 无外乎以下几种情况 xff1a 父子组件之间相互传值 xff0c 兄弟节点之间传值 最常见的就是父子组件 xff0c 做法也很简单 xff1a 就是在父组件中直接通过props属性的方式将
  • 利用mocha进行以太坊智能合约编译部署测试

    使用智能合约编程语言solidity编写的智能合约 xff0c 除了可以直接通过以太坊的工具链truffle ganache cli进行测试之外 xff0c 还可以结合mocha进行单元测试 mocha单元测试本质上 xff0c 还是需要对
  • electron报错:Uncaught Error: A dynamic link library (DLL) initialization routine failed

    如题所示 xff0c 我们在进行node 43 electron开发桌面应用的时候 xff0c 经常会遇到这样的问题 xff1a 根据提示是因为ref依赖模块没有合适的编译版本 xff0c 但是我们进行npm install的时候没有报错啊
  • C语言 利用冒泡排序法对10个字符由小到大排序

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • truffle+ganache-cli构建简单以太坊智能合约并编译部署

    以前接触过以太坊工具链来做区块链练手项目 xff0c 后来荒废了 xff0c 如今再次捡起来 xff0c 算是回忆和加深 之前可能因为网络的原因 xff0c 在truffle各种初始化编译合成智能合约都遇到了好多问题 xff0c 如今再次尝
  • docker-compose搭建mongo+elasticsearch+graylog运行环境

    graylog是一个小型的开源日志收集 分析 展示框架 主要graylog运行需要mongo elasticsearch xff0c 所以他们就组成了一个小的整体 一般在虚拟机上搭建 xff0c 可以分开安装部署 xff0c 但是既然是一个
  • word文档中插入图片显示不全解决办法

    在windows下写word文档 xff0c 正常情况下 xff0c 我们应该不会遇到插入图片显示不全的问题 xff0c 好像是如果在已有的文档中插入图片 xff0c 比如文档中间插入 xff0c 图片没办法自动扩展空间 xff0c 这就导
  • quasar构建linux版本electron项目以及如何让electron程序在linux下运行

    quasar构建 xff0c 默认命令是 xff1a quasar build m electron 如果要支持linux xff0c 通常是直接加参数 target linux或者简写 T linux quasar build m ele
  • docker容器改变时区

    默认情况下的docker容器启动之后 xff0c 系统时间是UTC时间 xff0c 这导致和我们的北京时间相差8小时 xff0c 会引出很多问题 有一些容器是和项目一起构建的 xff0c 我们可以在构建的时候 xff0c 将系统时区修改为A
  • elasticsearch加入中文分词器elasticsearch-analysis-ik插件

    前言 elasticsearch作为一个分布式弹性存储与检索系统 xff0c 默认是不支持中文分词的 xff0c 但是呢 xff0c 这个工作有人做 xff0c 估计都是中国人做的吧 什么是中文分词呢 xff0c 简单来说 xff0c 就是
  • c语言自定义tcp协议实现socket通信

    一般的tcp协议示例 xff0c 大家给出的demo都是类似一个helloworld的示例 xff0c 简单罗列了socket建立 xff0c 创建连接 xff0c 发送数据 xff0c 关闭连接的过程 xff0c 实际上tcp通信确实也就
  • c语言自定义tcp协议实现socket通信(windows版本)

    前面一篇博客介绍了mac linux下通过C语言自定义协议实现socket通信的示例 xff0c 因为大部分api与windows还有很多区别 xff0c 这里就特意把windows下的tcp通信实例给介绍一下 无论是linux xff0c