C++中使用UDP Socket发送字节数据

article/2025/4/28 7:34:43

文章目录

  • 参考
  • 代码
  • 结果展示

参考

这篇文章给的代码也能用 https://blog.csdn.net/qq_36437446/article/details/106446172
CRC代码来自https://blog.csdn.net/huijunma2010/article/details/124151471

在线计算CRC http://www.ip33.com/crc.html

代码

这里的byteunsigned char ,1个字节

//#include<tchar.h>
#define _HAS_STD_BYTE 0
#include<numeric>
#include <cstddef>
#include <bitset>
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#include <WS2tcpip.h>
#include<string>
#include<cstring>
#include <windows.h>#pragma comment(lib, "ws2_32.lib")
using namespace std;
const int nPort = 7799;
const string addRess = "127.0.0.1";byte Reverse8(byte data)
{byte i;byte temp = 0;for (i = 0; i < 8; i++){temp = (byte)(temp | (((data >> i) & 0x01) << (7 - i)));}return temp;
}//CRC-8/MAXIM参数模型
byte GetCRC8(byte buffer[], int length)
{byte data;byte crc = 0x00; //初始值(16位举个例子0xFFFF,8位0xFF)int i;for (int j = 0; j < length; j++){data = buffer[j];data = (byte)Reverse8(data); //输入是否反转,如果不需要则这句注释掉;crc = (byte)(crc ^ (data << 0)); //32位左移24位,16位左移8位,8位左移0位;for (i = 0; i < 8; i++){if ((crc & 0x80) == 0x80)//16位 0x8000  8位 0x80{crc = (crc << 1) ^ 0x31;//多项式,没什么好说的;}else{crc <<= 1;}}}crc = Reverse8(crc);//输出是否需要反转,如果不需要则注释掉这句话,注意如果是16位则调用Reverse16(crc),8位调用Reverse8(crc)crc = crc ^ 0x00;// xor 异或值(与上面初始值类似,16位 0x0000  8位 0x00;return crc;
}//炫技的成分大一点
//使用C语言里的struct和union来处理组帧和解帧特别漂亮
struct MagicFrame {union {byte notCRC[4+256+2];struct { byte FrameHead[4]; byte FixedNumber[256]; byte FrameIndex[2]; } notCRC_slice;} ;byte CRC;
};int main()
{/*组帧:FrameHead和FixedNumber*/   struct MagicFrame FrameBuilder;for (int i = 0; i < 4; i++) {FrameBuilder.notCRC_slice.FrameHead[i] = static_cast <byte>(0x7A);}for (int i = 0; i < 256; i++) {FrameBuilder.notCRC_slice.FixedNumber[i] = static_cast <byte>(i);}/*组帧:FrameHead和FixedNumber*/WSAData wsd;SOCKADDR_IN siLocal;//启动Winsockif (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) {cout << "WSAStartup Error = " << WSAGetLastError() << endl;return 0;}SOCKET soSend = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (soSend == SOCKET_ERROR) {cout << "socket Error = " << WSAGetLastError() << endl;return 1;}siLocal.sin_family = AF_INET;siLocal.sin_port = htons(nPort);inet_pton(AF_INET, addRess.c_str(), &siLocal.sin_addr.S_un.S_addr);for (short int frame = 0; frame < 10; frame++) {/*填充FrameIndex*/void* p = &frame;byte* p1 = (byte*)(p);byte* p2 = (byte*)(p1 + 1);FrameBuilder.notCRC_slice.FrameIndex[0] = *p2;FrameBuilder.notCRC_slice.FrameIndex[1] = *p1;/*填充FrameIndex*//*填充CRC*/FrameBuilder.CRC = GetCRC8(FrameBuilder.notCRC, _countof(FrameBuilder.notCRC) );/*填充CRC*/int nRet = sendto(soSend,(const char*)&FrameBuilder,sizeof(FrameBuilder),0,(SOCKADDR*)&siLocal,sizeof(SOCKADDR));if (nRet == SOCKET_ERROR) {cout << "sendto Error " << WSAGetLastError() << endl;}else {cout << "toSend frame:" << frame << "success\n";}Sleep(1000);}closesocket(soSend);WSACleanup();return 0;
}

下面这份代码效果一样,但是不容易阅读

//#include<tchar.h>
#define _HAS_STD_BYTE 0
#include<numeric>
#include <cstddef>
#include <bitset>
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#include <WS2tcpip.h>
#include<string>
#include<cstring>
#include <windows.h>#pragma comment(lib, "ws2_32.lib")
using namespace std;
const int nPort = 7799;
const string addRess = "127.0.0.1";byte Reverse8(byte data)
{byte i;byte temp = 0;for (i = 0; i < 8; i++){temp = (byte)(temp | (((data >> i) & 0x01) << (7 - i)));}return temp;
}byte GetCRC8( byte buffer [],int length)
{byte data;byte crc = 0x00; //初始值(16位举个例子0xFFFF,8位0xFF)int i;for (int j = 0; j < length; j++){data = buffer[j];data = (byte)Reverse8(data); //输入是否反转,如果不需要则这句注释掉;crc = (byte)(crc ^ (data << 0)); //32位左移24位,16位左移8位,8位左移0位;for (i = 0; i < 8; i++){if ((crc & 0x80) == 0x80)//16位 0x8000  8位 0x80{crc = (crc << 1) ^ 0x31;//多项式,没什么好说的;}else{crc <<= 1;}}}crc = Reverse8(crc);//输出是否需要反转,如果不需要则注释掉这句话,注意如果是16位则调用Reverse16(crc),8位调用Reverse8(crc)crc = crc ^ 0x00;// xor 异或值(与上面初始值类似,16位 0x0000  8位 0x00;return crc;
}int main()
{/*组帧:FrameHead和FixedNumber*/int FrameHead_len = 4;int FixedNumber_len = 256;int FrameIndex_len = 2;int CRC_len = 1;int len_arr[] = { FrameHead_len ,FixedNumber_len, FrameIndex_len ,CRC_len };int total_len = std::accumulate(len_arr, len_arr + _countof(len_arr), 0);byte FrameBuilder[4+256+2+1] = {};int offset_arr[4];partial_sum(len_arr, len_arr+_countof(len_arr), offset_arr);for (int i = 0; i < 4; i++) {FrameBuilder[i+0] = static_cast <byte>(0x7A);}for (int i = 0; i < 256; i++) {FrameBuilder[i + offset_arr[0]] = static_cast <byte>(i);}/*组帧:FrameHead和FixedNumber*/WSAData wsd;SOCKET soSend;int nRet = 0;SOCKADDR_IN siLocal;//启动Winsockif (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) {cout << "WSAStartup Error = " << WSAGetLastError() << endl;return 0;}soSend = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (soSend == SOCKET_ERROR) {cout << "socket Error = " << WSAGetLastError() << endl;return 1;}siLocal.sin_family = AF_INET;siLocal.sin_port = htons(nPort);inet_pton(AF_INET, addRess.c_str(), &siLocal.sin_addr.S_un.S_addr);for (short int frame = 0; frame < 10; frame++) {/*填充FrameIndex*/void* p = &frame;byte* p1 = (byte*)(p);byte* p2 = (byte*)(p1 + 1);FrameBuilder[0 + offset_arr[1]] = *p2;FrameBuilder[1 + offset_arr[1]] = *p1;/*填充FrameIndex*//*填充CRC*/FrameBuilder[0+ offset_arr[2]] =GetCRC8(FrameBuilder,_countof(FrameBuilder)-1);/*填充CRC*/nRet = sendto(  soSend,(const char*)&FrameBuilder,_countof(FrameBuilder),0,(SOCKADDR*)&siLocal,sizeof(SOCKADDR));if (nRet == SOCKET_ERROR) {cout << "sendto Error " << WSAGetLastError() << endl;}else {cout << "toSend frame:" << frame << "success\n";}Sleep(1000);}closesocket(soSend);WSACleanup();return 0;
}

结果展示

在这里插入图片描述


http://chatgpt.dhexx.cn/article/2LMQuXmp.shtml

相关文章

本机UDP收发性能测试

测试内容 测试单机版的UPD客户端和服务端之间的性能&#xff0c;UDP客户端发送数据到UDP服务端&#xff0c;并等待服务端返回&#xff0c;计算出UDP的性能 测试方法 客户端和服务端部署在同一台虚拟机器上&#xff0c;客户端启动多个线程&#xff0c;同时向服务端发送指定数量…

2020复旦大学计算机夏令营机试题

2020复旦大学计算机夏令营机试题 这个是开卷编程&#xff0c;不计入成绩&#xff0c;但是面试会问你做的情况。

复旦大学机试题题解(2017~2021)

前言 尝试把复旦大学历年的机试题做一遍&#xff0c;能做多少是多少了&#xff0c;因为没有数据集所以也不好确认是不是对的~&#xff08;题目来自王道往届学长学姐回忆以及某位热心的同学整理&#xff0c;如果了解来源后&#xff0c;我一定备注来源&#xff09; &#xff08;…

复旦大学:专硕没住宿?我们帮你建!还给补助!

去年&#xff0c;小编发过一篇文章&#xff0c;里面爆出了复旦大学等学校的专硕可能不提供住宿了&#xff1a; 北京大学 上海交通大学 复旦大学 专硕可能不提供住宿&#xff01; 后来&#xff0c;在复旦大学2019年招收攻读硕士学位研究生简章中&#xff0c;学校官方公布了不为专…

复旦大学机试题(2017-2021)

计院2021 1.完全二叉树 给定一颗二叉树&#xff0c;树的每个节点的值为一个正整数。如果从根节点到节点 N 的路径上不存在比节点 N 的值大的节点&#xff0c;那么节点 N 被认为是树上的关键节点。求树上所有的关键节点的个数。请写出程序&#xff0c;并解释解题思路。 例子&a…

三战上岸复旦工研院考研回忆(无干货)

干货链接&#xff1a; 复旦085400电子信息专硕初试经验分享 复旦085400电子信息专硕复试经验分享 复旦软院电子信息初试961真题回忆 说说一下我的考研经历&#xff0c;都是流水账&#xff0c;不涉及干货&#xff08;干货参照其他博客&#xff09;&#xff0c;如果读者能有所借…

2020年复旦大学夏令营机试题及代码(VS2019 C++)

注:代码是本菜鸡自己个儿写的,没有找到参考答案,欢迎各位大佬批评指正. 题目如下图所示&#xff08;图片来源网上&#xff09;: 第1题 该题主要考察拓扑排序.其实该算法有通用模板,但我写的时候没有意识到使用,代码不是很规范. #define _CRT_SECURE_NO_WARNINGS#include &…

复旦大学研究生机试(2019)

1. 计算机学院 今年的题目可以说是挺难的&#xff0c;第一题虽然像是送分题&#xff0c;实际上也不是很简单。第二题第三题是动态规划问题&#xff0c;而且复旦据说会卡大数&#xff0c;今年150人考生据说只有一个AC&#xff0c;大部分人只做出第一题&#xff0c;个别零分。 …

【20保研】2019年复旦大学工程与应用技术研究院全国优秀大学生夏令营通知

点击文末的阅读原文或者公众号界面左下角的保研夏令营或者公众号回复“夏令营”是计算机/软件等专业的所有保研夏令营信息集合&#xff0c;会一直更新的。 为了促进我国高校优秀大学生之间的交流、加强学生对复旦大学工研院的了解、特别是吸引优秀学生继续深造&#xff0c;探索…

复旦大学计算机专业硕士平均工资,在复旦大学当教授“月薪”是多少?这个工资条,让网友非常羡慕!...

文章原创&#xff0c;版权归本作者所有&#xff0c;欢迎个人转发分享 随着中国的高等教育发展的重视&#xff0c;很多的高校也是不负众望&#xff0c;不仅在国内知名度很高&#xff0c;在国外也享有盛誉的。 在中国知名度最高的大学就是清华、北大、复旦等高校&#xff0c;是受…

复旦计院、工研院2019机试真题及答案详解

计院 A 相隔天数 输入一个 yyyymmdd 格式的时间&#xff0c;如 20190318&#xff0c;计算与 20190205 相差的天数&#xff0c; 取绝对值&#xff0c;所有输入在 19000101 和 21000101 之间。 样例输入&#xff1a;20190208 输出&#xff1a;3 #include<iostream>us…

复旦计院、工研院2018机试真题及答案详解

计院 A 求众数 众数就是一个序列中出现次数最多的数字。 如果不唯一&#xff0c;则输出小的那个值。 给定第一个代表有几个数字。 1<n<10^5 每个数字在 int 范围内样例&#xff1a; 输入&#xff0c; &#xff08;第一个代表有几个数字&#xff09;8 10 3 8 8 …

2019年复旦大学机试题

机试&#xff1a; 一、计算机学院&#xff1a; 1、 算法笔记上有类似题&#xff0c;且time与time2都是输入。 而本体time是输入&#xff0c;time2是题目给的。 设置time与time2&#xff0c;为计算方便设定让time恒小于time2。 方法&#xff1a;从time&#xff08;较早的日期…

2019 复旦大学工研院上机题-计算通讯代价

题目&#xff1a; 给出一个树&#xff0c;计算每个节点到其他节点的通讯代价的总和&#xff0c;假如树为 1————2————3 1 则结点 1&#xff0c;2&#xff0c;3 通讯代价分别为&#xff1a;3&#xff0c;2&#xff0c;3 例&#xff1a; 输入&#xff1a; 3 1 2 2 3 输出&…

更正:复旦大学工研院计算机学硕不是第一年招生

首先对大家说一声抱歉&#xff01; 昨天弄错了复旦大学工研院的情况。 据复旦大学工研院的在读同学描述&#xff0c;实际上复旦大学工研院计算机学硕是第二年招生&#xff0c;专硕是第一年招生。 专硕的招生目录&#xff1a; 考试内容&#xff1a;①101思想政治理论;②204英语二…

研究生院校推荐——复旦大学工研院

概述 过去的一年几乎都在准备考研&#xff0c;现在差不多勉强上岸&#xff0c;写一点经验和教训。 我最初的目标院校是上海交大电院计算机&#xff0c;最后上岸是复旦大学工研院计算机。 今年的上交计算机专硕分数线是325&#xff0c;复旦工研院学硕分数线是340&#xff0c;题…

入营人数线性增长,录取人数保持稳定,复旦工研院有点抢手

1、院校介绍 复旦大学工程与应用技术研究院是复旦大学发挥文理医综合优势&#xff0c;聚焦解决国家重大需求的工程与应用研发&#xff0c;发展具有复旦特色工程学科的一项重要举措。其下设有智能机器人研究院、生物医学工程技术研究所和超越照明研究所三个研究机构。近几年来&…

链路聚合实验

目录 1 链路聚合配置实验 1.1 实验内容 1.2 实验原理 1.3 关键命令 1.4 配置过程 2 链路聚合与VLAN配置实验 2.1 实验内容 2.2 实验原理 2.3 配置过程 3 链路聚合与生成树配置实验 3.1 实验内容 3.2 实验原理 3.3 配置过程 4 链路聚合与RSPAN配置实验 4.1 实验…

链路聚合配置

链路聚合 链路聚合介绍 链路聚合模式 链路聚合配置 链路聚合介绍 链路聚合&#xff1a;将多个以太网链路捆绑为一条逻辑的以太网链路 作用&#xff1a; 1.提高带宽 2.节省IP地址 链路聚合组 二层聚合组&#xff1a;随着二层聚合端口的创建自动生成的&#xff0c;只包含二…

为什么会有链路聚合这种技术?

这里写目录标题 前言链路聚合是什么&#xff1f;二层交换机链路聚合三层交换机链路聚合总结 前言 在企业网络中&#xff0c;所有设备的流量在转发到其他网络前都会汇聚到核心层&#xff0c;再由核心区设备转发到其他网络&#xff0c;或者转发到外网。因此&#xff0c;在核心层…