C#与C++通过socket传送结构体
2016-10-05 20:04
316 查看
C#服务端:
1
using System;
2
using System.Net.Sockets;
3
using System.Net;
4
using System.IO;
5
using System.Diagnostics;
6
using System.Threading;
7
using System.Runtime.InteropServices;
8
9
10
11
12
13
[StructLayout(LayoutKind.Sequential, Pack = 1)]
14
public struct PaketHead
15
{
16
public UInt32 OPCode;
17
public byte DiskFlag;
18
public long DiskSize;
19
public long OPOffSet;
20
public long OPByteCount;
21
22
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
23
public byte[] Authentic;
24
public byte Encrypt;
25
public byte Ver;
26
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
27
public byte[] AddIn;
28
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
29
public byte[] Reserve;
30
public byte Zero;
31
public int SizeOfHead;
32
}
33
34
protected byte[] Struct2Bytes<T>(T obj)
35
{
36
int size = Marshal.SizeOf(obj);
37
byte[] bytes = new byte[size];
38
IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
39
Marshal.StructureToPtr(obj, arrPtr, true);
40
return bytes;
41
}
42
43
protected T Bytes2Struct<T>(byte[] bytes)
44
{
45
IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
46
return (T)Marshal.PtrToStructure(arrPtr, typeof(T));
47
}
48
49
protected void ReadPacketHead(BinaryReader ClientReader, BinaryWriter ClientWriter)
50
{
51
byte[] test = null;
52
test = ClientReader.ReadBytes(180);
53
54
PaketHead Paket = Bytes2Struct<PaketHead>(test);
55
56
Console.WriteLine(Paket.OPCode);
57
Console.WriteLine(Paket.DiskFlag);
58
Console.WriteLine(Paket.DiskSize);
59
Console.WriteLine(Paket.OPOffSet);
60
Console.WriteLine(Paket.OPByteCount);
61
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.Authentic));
62
Console.WriteLine(Paket.Encrypt);
63
Console.WriteLine(Paket.Ver);
64
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.AddIn));
65
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.Reserve));
66
Console.WriteLine(Paket.Zero);
67
Console.WriteLine(Paket.SizeOfHead);
68
/////////////////////////////////
69
test = Struct2Bytes<PaketHead>(Paket);
70
ClientWriter.Write(test);
71
}
72
73
C++ Client:
1
#include <winsock2.h>
2
#pragma comment( lib, "ws2_32.lib" )
3
4
#pragma pack(push, 1)//取消内存大小自动对齐
5
6
typedef struct _PaketHead2
7
{
8
UINT OPCode;/////////////
9
UCHAR DiskFlag;//////////
10
__int64 DiskSize;////////
11
__int64 OPOffSet;////////
12
__int64 OPByteCount;/////
13
UCHAR Authentic[64];//
14
UCHAR Encrypt;////////
15
UCHAR Ver;////////////
16
UCHAR AddIn[64];//////
17
UCHAR Reserve[16];////
18
UCHAR Zero;///////////
19
UINT SizeOfHead;/////////
20
}PaketHead2,*pPaketHead2;
21
22
#pragma pack(pop)
23
24
//template <class T>
25
//void ConvertToByteArray(T arg,unsigned char * Buffer)
26
//{
27
// for (int i=0;i<sizeof(T); i++)
28
// {
29
// int offset = i*8;
30
// Buffer[i] = (arg& (0xff << offset)) >> offset;
31
// }
32
//}
33
//
34
//template <class T>
35
//T ConvertBytesTo(byte *buf)
36
//{
37
// T ret = 0x0;
38
// for (int i=0;i<sizeof(T); i++)
39
// {
40
// int offset = i*8;
41
// ret |= buf[i] << offset;
42
// }
43
// return (ret);
44
//}
45
46
int ConnTest()
47
{
48
SOCKET mySocket;
49
WORD wVersionRequested;
50
WSADATA wsaData;
51
int err;
52
53
wVersionRequested = MAKEWORD( 2, 2 );
54
55
WSAStartup( wVersionRequested, &wsaData );
56
57
try
58
{
59
err = WSAStartup( wVersionRequested, &wsaData );
60
if ( err != 0 ) {
61
printf("Couldn't find a WinSock DLL\n");
62
return 1;
63
}
64
65
if ( LOBYTE( wsaData.wVersion ) != 2 ||
66
HIBYTE( wsaData.wVersion ) != 2 )
67
{
68
printf("Couldn't find the right version for WinSock 2.2\n");
69
WSACleanup( );
70
return 1;
71
}
72
73
SOCKADDR_IN ServerAddr;
74
75
mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
76
ServerAddr.sin_family = AF_INET;
77
ServerAddr.sin_port = htons(8021);
78
ServerAddr.sin_addr.s_addr = inet_addr("192.168.0.5");
79
80
81
if (connect(mySocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)))
82
{
83
int error_code = WSAGetLastError();
84
printf("Error connecting socket: %d\n",error_code);
85
return 1;
86
}
87
88
/////////
89
90
PaketHead2 testhead2;
91
92
memset(&testhead2,0x00,sizeof(PaketHead2));
93
94
testhead2.DiskFlag = 0x1;
95
testhead2.OPCode = 9856;
96
testhead2.DiskSize = 78954612;
97
testhead2.OPOffSet = 98643217;
98
testhead2.OPByteCount = 85642311;
99
100
memcpy(testhead2.Authentic,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",64);
101
memcpy(testhead2.AddIn,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",64);
102
memcpy(testhead2.Reserve,"abcdefghij12345\0",16);
103
104
testhead2.Encrypt = 0x2;
105
testhead2.Ver = 0x4;
106
testhead2.Zero = 0x0;
107
testhead2.SizeOfHead = sizeof(PaketHead2);
108
109
send(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL);
110
111
memset(&testhead2,0x00,sizeof(PaketHead2));
112
recv(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL);
113
114
/*testhead2.Authentic[63] = 0;
115
testhead2.AddIn[63] = 0;
116
testhead2.Reserve[15] = 0;*/
117
118
printf("%d\n",testhead2.OPCode);
119
printf("%d\n",testhead2.DiskFlag);
120
121
printf("%ld\n",testhead2.DiskSize);
122
printf("%ld\n",testhead2.OPOffSet);
123
printf("%ld\n",testhead2.OPByteCount);
124
125
printf("%s\n",testhead2.Authentic);
126
printf("%d\n",testhead2.Encrypt);
127
printf("%d\n",testhead2.Ver);
128
129
printf("%s\n",testhead2.AddIn);
130
printf("%s\n",testhead2.Reserve);
131
132
printf("%d\n",testhead2.Zero);
133
134
printf("%d\n",testhead2.SizeOfHead);
135
//////////////////////////////////////////////////
136
closesocket(mySocket);
137
WSACleanup( );
138
}
139
catch(
)
140
{
141
printf("Error!\n");
142
}
143
}
1
using System;
2
using System.Net.Sockets;
3
using System.Net;
4
using System.IO;
5
using System.Diagnostics;
6
using System.Threading;
7
using System.Runtime.InteropServices;
8
9
10
11
12
13
[StructLayout(LayoutKind.Sequential, Pack = 1)]
14
public struct PaketHead
15
{
16
public UInt32 OPCode;
17
public byte DiskFlag;
18
public long DiskSize;
19
public long OPOffSet;
20
public long OPByteCount;
21
22
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
23
public byte[] Authentic;
24
public byte Encrypt;
25
public byte Ver;
26
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
27
public byte[] AddIn;
28
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
29
public byte[] Reserve;
30
public byte Zero;
31
public int SizeOfHead;
32
}
33
34
protected byte[] Struct2Bytes<T>(T obj)
35
{
36
int size = Marshal.SizeOf(obj);
37
byte[] bytes = new byte[size];
38
IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
39
Marshal.StructureToPtr(obj, arrPtr, true);
40
return bytes;
41
}
42
43
protected T Bytes2Struct<T>(byte[] bytes)
44
{
45
IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
46
return (T)Marshal.PtrToStructure(arrPtr, typeof(T));
47
}
48
49
protected void ReadPacketHead(BinaryReader ClientReader, BinaryWriter ClientWriter)
50
{
51
byte[] test = null;
52
test = ClientReader.ReadBytes(180);
53
54
PaketHead Paket = Bytes2Struct<PaketHead>(test);
55
56
Console.WriteLine(Paket.OPCode);
57
Console.WriteLine(Paket.DiskFlag);
58
Console.WriteLine(Paket.DiskSize);
59
Console.WriteLine(Paket.OPOffSet);
60
Console.WriteLine(Paket.OPByteCount);
61
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.Authentic));
62
Console.WriteLine(Paket.Encrypt);
63
Console.WriteLine(Paket.Ver);
64
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.AddIn));
65
Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.Reserve));
66
Console.WriteLine(Paket.Zero);
67
Console.WriteLine(Paket.SizeOfHead);
68
/////////////////////////////////
69
test = Struct2Bytes<PaketHead>(Paket);
70
ClientWriter.Write(test);
71
}
72
73
C++ Client:
1
#include <winsock2.h>
2
#pragma comment( lib, "ws2_32.lib" )
3
4
#pragma pack(push, 1)//取消内存大小自动对齐
5
6
typedef struct _PaketHead2
7
{
8
UINT OPCode;/////////////
9
UCHAR DiskFlag;//////////
10
__int64 DiskSize;////////
11
__int64 OPOffSet;////////
12
__int64 OPByteCount;/////
13
UCHAR Authentic[64];//
14
UCHAR Encrypt;////////
15
UCHAR Ver;////////////
16
UCHAR AddIn[64];//////
17
UCHAR Reserve[16];////
18
UCHAR Zero;///////////
19
UINT SizeOfHead;/////////
20
}PaketHead2,*pPaketHead2;
21
22
#pragma pack(pop)
23
24
//template <class T>
25
//void ConvertToByteArray(T arg,unsigned char * Buffer)
26
//{
27
// for (int i=0;i<sizeof(T); i++)
28
// {
29
// int offset = i*8;
30
// Buffer[i] = (arg& (0xff << offset)) >> offset;
31
// }
32
//}
33
//
34
//template <class T>
35
//T ConvertBytesTo(byte *buf)
36
//{
37
// T ret = 0x0;
38
// for (int i=0;i<sizeof(T); i++)
39
// {
40
// int offset = i*8;
41
// ret |= buf[i] << offset;
42
// }
43
// return (ret);
44
//}
45
46
int ConnTest()
47
{
48
SOCKET mySocket;
49
WORD wVersionRequested;
50
WSADATA wsaData;
51
int err;
52
53
wVersionRequested = MAKEWORD( 2, 2 );
54
55
WSAStartup( wVersionRequested, &wsaData );
56
57
try
58
{
59
err = WSAStartup( wVersionRequested, &wsaData );
60
if ( err != 0 ) {
61
printf("Couldn't find a WinSock DLL\n");
62
return 1;
63
}
64
65
if ( LOBYTE( wsaData.wVersion ) != 2 ||
66
HIBYTE( wsaData.wVersion ) != 2 )
67
{
68
printf("Couldn't find the right version for WinSock 2.2\n");
69
WSACleanup( );
70
return 1;
71
}
72
73
SOCKADDR_IN ServerAddr;
74
75
mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
76
ServerAddr.sin_family = AF_INET;
77
ServerAddr.sin_port = htons(8021);
78
ServerAddr.sin_addr.s_addr = inet_addr("192.168.0.5");
79
80
81
if (connect(mySocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)))
82
{
83
int error_code = WSAGetLastError();
84
printf("Error connecting socket: %d\n",error_code);
85
return 1;
86
}
87
88
/////////
89
90
PaketHead2 testhead2;
91
92
memset(&testhead2,0x00,sizeof(PaketHead2));
93
94
testhead2.DiskFlag = 0x1;
95
testhead2.OPCode = 9856;
96
testhead2.DiskSize = 78954612;
97
testhead2.OPOffSet = 98643217;
98
testhead2.OPByteCount = 85642311;
99
100
memcpy(testhead2.Authentic,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",64);
101
memcpy(testhead2.AddIn,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",64);
102
memcpy(testhead2.Reserve,"abcdefghij12345\0",16);
103
104
testhead2.Encrypt = 0x2;
105
testhead2.Ver = 0x4;
106
testhead2.Zero = 0x0;
107
testhead2.SizeOfHead = sizeof(PaketHead2);
108
109
send(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL);
110
111
memset(&testhead2,0x00,sizeof(PaketHead2));
112
recv(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL);
113
114
/*testhead2.Authentic[63] = 0;
115
testhead2.AddIn[63] = 0;
116
testhead2.Reserve[15] = 0;*/
117
118
printf("%d\n",testhead2.OPCode);
119
printf("%d\n",testhead2.DiskFlag);
120
121
printf("%ld\n",testhead2.DiskSize);
122
printf("%ld\n",testhead2.OPOffSet);
123
printf("%ld\n",testhead2.OPByteCount);
124
125
printf("%s\n",testhead2.Authentic);
126
printf("%d\n",testhead2.Encrypt);
127
printf("%d\n",testhead2.Ver);
128
129
printf("%s\n",testhead2.AddIn);
130
printf("%s\n",testhead2.Reserve);
131
132
printf("%d\n",testhead2.Zero);
133
134
printf("%d\n",testhead2.SizeOfHead);
135
//////////////////////////////////////////////////
136
closesocket(mySocket);
137
WSACleanup( );
138
}
139
catch(
)
140
{
141
printf("Error!\n");
142
}
143
}
相关文章推荐
- C#与C++通过socket传送结构体
- 验证C#通过Socket传给C++的MD5编码后的数据
- C#通过TCP传送结构体
- C#通过TCP传送结构体
- c/c++通过socket发送结构体
- c/c++通过socket发送结构体
- JAVA和C++通过socket发送和接收结构体
- 本文使用c#通过oledb可获取excel文件表的结构信息,同理也可以获得access等数据库的表结构信息,实现如下:
- C++和C#进程间通过命名管道来通信(附源码)—上
- C++和C#进程间通过命名管道来通信(附源码)—上
- C# Socket实现通过公共服务程序获取数据的例子
- c#2005如何通过socket传输图片
- 通过socket方式传送swf文件来避免泄漏
- c++返回结构数组给c#
- C#的Form通过CLI调用C++的DLL
- 用C#(C++)Socket后台编写自己的IIS服务器代替IIS
- 构建简单的 C++ 服务组件,第 2 部分: 通过服务组件体系结构使用 Python、Ruby 和 Web 服务
- c#.net 通过 c++.net 使用 windows API 及unmanaged code
- C#调用C++中带结构体指针的方法,憋了3个小时!
- 如何通过socket发送和接受dataset数据集(C#)