C#与C++通过socket传送结构体
C#服务端:
using System;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential, Pack = )]
public struct PaketHead
{
public UInt32 OPCode;
public byte DiskFlag;
public long DiskSize;
public long OPOffSet;
public long OPByteCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] Authentic;
public byte Encrypt;
public byte Ver;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] AddIn;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] Reserve;
public byte Zero;
public int SizeOfHead;
} protected byte[] Struct2Bytes<T>(T obj)
{
int size = Marshal.SizeOf(obj);
byte[] bytes = new byte[size];
IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, );
Marshal.StructureToPtr(obj, arrPtr, true);
return bytes;
} protected T Bytes2Struct<T>(byte[] bytes)
{
IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, );
return (T)Marshal.PtrToStructure(arrPtr, typeof(T));
} protected void ReadPacketHead(BinaryReader ClientReader, BinaryWriter ClientWriter)
{
byte[] test = null;
test = ClientReader.ReadBytes(); PaketHead Paket = Bytes2Struct<PaketHead>(test); Console.WriteLine(Paket.OPCode);
Console.WriteLine(Paket.DiskFlag);
Console.WriteLine(Paket.DiskSize);
Console.WriteLine(Paket.OPOffSet);
Console.WriteLine(Paket.OPByteCount);
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.Authentic));
Console.WriteLine(Paket.Encrypt);
Console.WriteLine(Paket.Ver);
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.AddIn));
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.Reserve));
Console.WriteLine(Paket.Zero);
Console.WriteLine(Paket.SizeOfHead);
/////////////////////////////////
test = Struct2Bytes<PaketHead>(Paket);
ClientWriter.Write(test);
}
C++ Client:
#include <winsock2.h>
#pragma comment( lib, "ws2_32.lib" ) #pragma pack(push, 1)//取消内存大小自动对齐 typedef struct _PaketHead2
{
UINT OPCode;/////////////
UCHAR DiskFlag;//////////
__int64 DiskSize;////////
__int64 OPOffSet;////////
__int64 OPByteCount;/////
UCHAR Authentic[];//
UCHAR Encrypt;////////
UCHAR Ver;////////////
UCHAR AddIn[];//////
UCHAR Reserve[];////
UCHAR Zero;///////////
UINT SizeOfHead;/////////
}PaketHead2,*pPaketHead2; #pragma pack(pop) //template <class T>
//void ConvertToByteArray(T arg,unsigned char * Buffer)
//{
// for (int i=0;i<sizeof(T); i++)
// {
// int offset = i*8;
// Buffer[i] = (arg& (0xff << offset)) >> offset;
// }
//}
//
//template <class T>
//T ConvertBytesTo(byte *buf)
//{
// T ret = 0x0;
// for (int i=0;i<sizeof(T); i++)
// {
// int offset = i*8;
// ret |= buf[i] << offset;
// }
// return (ret);
//} int ConnTest()
{
SOCKET mySocket;
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD( , ); WSAStartup( wVersionRequested, &wsaData ); try
{
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != ) {
printf("Couldn't find a WinSock DLL\n");
return ;
} if ( LOBYTE( wsaData.wVersion ) != ||
HIBYTE( wsaData.wVersion ) != )
{
printf("Couldn't find the right version for WinSock 2.2\n");
WSACleanup( );
return ;
} SOCKADDR_IN ServerAddr; mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons();
ServerAddr.sin_addr.s_addr = inet_addr("192.168.0.5"); if (connect(mySocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)))
{
int error_code = WSAGetLastError();
printf("Error connecting socket: %d\n",error_code);
return ;
} ///////// PaketHead2 testhead2; memset(&testhead2,0x00,sizeof(PaketHead2)); testhead2.DiskFlag = 0x1;
testhead2.OPCode = ;
testhead2.DiskSize = ;
testhead2.OPOffSet = ;
testhead2.OPByteCount = ;
memcpy(testhead2.Authentic,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",);
memcpy(testhead2.AddIn,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",);
memcpy(testhead2.Reserve,"abcdefghij12345\0",); testhead2.Encrypt = 0x2;
testhead2.Ver = 0x4;
testhead2.Zero = 0x0;
testhead2.SizeOfHead = sizeof(PaketHead2); send(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL); memset(&testhead2,0x00,sizeof(PaketHead2));
recv(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL); /*testhead2.Authentic[63] = 0;
testhead2.AddIn[63] = 0;
testhead2.Reserve[15] = 0;*/ printf("%d\n",testhead2.OPCode);
printf("%d\n",testhead2.DiskFlag); printf("%ld\n",testhead2.DiskSize);
printf("%ld\n",testhead2.OPOffSet);
printf("%ld\n",testhead2.OPByteCount); printf("%s\n",testhead2.Authentic);
printf("%d\n",testhead2.Encrypt);
printf("%d\n",testhead2.Ver); printf("%s\n",testhead2.AddIn);
printf("%s\n",testhead2.Reserve); printf("%d\n",testhead2.Zero); printf("%d\n",testhead2.SizeOfHead);
//////////////////////////////////////////////////
closesocket(mySocket);
WSACleanup( );
}
catch()
{
printf("Error!\n");
}
}
引文链接:
C#与C++通过socket传送结构体的更多相关文章
- 通过TCP传送结构体的问题
这个问题在其他博客中已经给出了解决方案,这里结合自己的Demo说一下. 函数调用的库文件是基于TCP协议的封装,在传送消息体的时候,发送消息结果大体如下: XXXXPost(srcid, EVENT, ...
- socket发送结构体
struct send_info {char info_from[20]; //发送者IDchar info_to[20]; //接收者IDint info_length; //发送的消息主体的长度c ...
- C# Socket 入门4 UPD 发送结构体(转)
今天我们来学 socket 发送结构体 1. 先看要发送的结构体 using System; using System.Collections.Generic; using System.Text; ...
- Linux C Socket编程发送结构体、文件详解及实例
利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.c ...
- 2. socket结构体——表示socket地址
一.两种通用socket结构体 1. sockaddr struct sockaddr { sa_family_t sa_family; // 地址族 char sa_data[14]; // 存放s ...
- C++学习(二十四)(C语言部分)之 结构体1
1.结构体 存放多个不同类型的数据 但是是相关联的 数组 存放多个相同类型的数据 结构体是存放多个相关联的不同类型的数组 struct 定义一个结构体类型 自定义类型 2.结构体定义方式 定义类型最通 ...
- C#结构体数组间的转化
转自:http://developer.51cto.com/art/200908/143779.htm 解决C#结构体数组间的转化问题的由来:在写C#TCP通信程序时,发送数据时,如果是和VC6.0等 ...
- java socket传送一个结构体给用C++编写的服务器解析的问题
另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...
- C与C# socket 跨平台通讯传输结构体
最近需要写一个C组成的服务器端与C#的客户端进行交互的软件,刚开始写的时候发现C#端解析时候出现了故障,经过仔细研究后发现原因是发送方传输太快,出现了所谓粘包的现象.也就是在C#端的Receive() ...
随机推荐
- golang学习之go简单博客应用
先说说golang的语法吧,个人觉得有以下特点: 简洁,不管是变量.方法声明,还是代码编写,均十分简洁,效率也比较高 非纯粹面向对象,但是go的struct类似c的struct,go的结构体还可以进行 ...
- .net EF框架 MySql实现实例
1.nuget中添加包EF和MySql.Data.Entity 2.config文件添加如下配置 1.配置entitframework节点(一般安装EF时自动添加) <entityFramewo ...
- the resource is not on the build path of a php project
打开工程里面的.project文件,确保里面的红色标记行都正确且存在,即可成功! <?xml version="1.0" encoding="UTF-8" ...
- flask路由末端带斜线和不带斜线的区别
路由末端带有“/” app.route('/test/') 在浏览器中输入http://127.0.0.1:5000/test/ 和http://127.0.0.1:5000/test都能访问 路由末 ...
- curl POST JSON
1. 场景 Controller接收json格式数据 封装bean @RequestMapping(value = "/bb", method = RequestMethod.PO ...
- 简单的数据库连接池实例(java语言)
1.概述 频繁的创建和销毁数据库连接消耗非常多的系统资源,创建一个池子, 管理一定数量的连接,用的时候去池中取,用完了放回池中,这时比较通用的做法. 2.关键字 LinkedList synchro ...
- BZOJ4698: Sdoi2008 Sandy的卡片(后缀数组 二分)
题意 题目链接 Sol 不要问我为什么发两篇blog,就是为了骗访问量 后缀数组的也比较好想,先把所有位置差分,然后在height数组中二分就行了 数据好水啊 // luogu-judger-enab ...
- COGS2259 异化多肽
传送门 听说是多项式求逆的模板题,以后不怕没地方练多项式求逆啦哈哈…… …… 我们设使用一个氨基酸能组成质量为$n$的多肽数量这个数列为$\{a_n\}$,设它的生成函数为$A(x)$,显然有 \be ...
- 优秀iOS文章集合
Runtime 10种用法(没有比这更全的了成为iOS顶尖高手,你必须来这里(这里有最好的开源项目和文章)iOS逆向Reveal查看任意app 的界面JSPatch (实时修复App Store bu ...
- 第三次scrum作业!
1.小组成员 舒 溢 许嘉荣 唐 浩 黄欣欣 廖帅元 刘洋江 薛思汝 2.个人在小组第三次冲刺任务及其完成情况描述 根据小组讨论所分配任务,积极辅助组长以及各个成员,理清思路,编写代码,尽量在规定时间 ...