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![](/Images/OutliningIndicators/None.gif)
9![](/Images/OutliningIndicators/None.gif)
10![](/Images/OutliningIndicators/None.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
11![](/Images/OutliningIndicators/None.gif)
12![](/Images/OutliningIndicators/None.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/None.gif)
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![](/Images/OutliningIndicators/None.gif)
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![](/Images/OutliningIndicators/None.gif)
49
protected void ReadPacketHead(BinaryReader ClientReader, BinaryWriter ClientWriter)
50
{
51
byte[] test = null;
52
test = ClientReader.ReadBytes(180);
53![](/Images/OutliningIndicators/InBlock.gif)
54
PaketHead Paket = Bytes2Struct<PaketHead>(test);
55![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/None.gif)
73![](/Images/OutliningIndicators/None.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
72
![](/Images/OutliningIndicators/None.gif)
73
![](/Images/OutliningIndicators/None.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
C++ Client:
1
#include <winsock2.h>
2
#pragma comment( lib, "ws2_32.lib" )
3![](/Images/OutliningIndicators/None.gif)
4
#pragma pack(push, 1)//取消内存大小自动对齐
5![](/Images/OutliningIndicators/None.gif)
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![](/Images/OutliningIndicators/None.gif)
22
#pragma pack(pop)
23![](/Images/OutliningIndicators/None.gif)
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![](/Images/OutliningIndicators/None.gif)
46
int ConnTest()
47
{
48
SOCKET mySocket;
49
WORD wVersionRequested;
50
WSADATA wsaData;
51
int err;
52![](/Images/OutliningIndicators/InBlock.gif)
53
wVersionRequested = MAKEWORD( 2, 2 );
54![](/Images/OutliningIndicators/InBlock.gif)
55
WSAStartup( wVersionRequested, &wsaData );
56![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
73
SOCKADDR_IN ServerAddr;
74![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
80![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
88
/////////
89![](/Images/OutliningIndicators/InBlock.gif)
90
PaketHead2 testhead2;
91![](/Images/OutliningIndicators/InBlock.gif)
92
memset(&testhead2,0x00,sizeof(PaketHead2));
93![](/Images/OutliningIndicators/InBlock.gif)
94
testhead2.DiskFlag = 0x1;
95
testhead2.OPCode = 9856;
96
testhead2.DiskSize = 78954612;
97
testhead2.OPOffSet = 98643217;
98
testhead2.OPByteCount = 85642311;
99![](/Images/OutliningIndicators/InBlock.gif)
100
memcpy(testhead2.Authentic,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",64);
101
memcpy(testhead2.AddIn,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",64);
102
memcpy(testhead2.Reserve,"abcdefghij12345\0",16);
103![](/Images/OutliningIndicators/InBlock.gif)
104
testhead2.Encrypt = 0x2;
105
testhead2.Ver = 0x4;
106
testhead2.Zero = 0x0;
107
testhead2.SizeOfHead = sizeof(PaketHead2);
108![](/Images/OutliningIndicators/InBlock.gif)
109
send(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL);
110![](/Images/OutliningIndicators/InBlock.gif)
111
memset(&testhead2,0x00,sizeof(PaketHead2));
112
recv(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL);
113![](/Images/OutliningIndicators/InBlock.gif)
114
/*testhead2.Authentic[63] = 0;
115
testhead2.AddIn[63] = 0;
116
testhead2.Reserve[15] = 0;*/
117![](/Images/OutliningIndicators/InBlock.gif)
118
printf("%d\n",testhead2.OPCode);
119
printf("%d\n",testhead2.DiskFlag);
120![](/Images/OutliningIndicators/InBlock.gif)
121
printf("%ld\n",testhead2.DiskSize);
122
printf("%ld\n",testhead2.OPOffSet);
123
printf("%ld\n",testhead2.OPByteCount);
124![](/Images/OutliningIndicators/InBlock.gif)
125
printf("%s\n",testhead2.Authentic);
126
printf("%d\n",testhead2.Encrypt);
127
printf("%d\n",testhead2.Ver);
128![](/Images/OutliningIndicators/InBlock.gif)
129
printf("%s\n",testhead2.AddIn);
130
printf("%s\n",testhead2.Reserve);
131
132
printf("%d\n",testhead2.Zero);
133![](/Images/OutliningIndicators/InBlock.gif)
134
printf("%d\n",testhead2.SizeOfHead);
135
//////////////////////////////////////////////////
136
closesocket(mySocket);
137
WSACleanup( );
138
}
139
catch(
)
140
{
141
printf("Error!\n");
142
}
143
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/None.gif)
40
![](/Images/OutliningIndicators/None.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/None.gif)
45
![](/Images/OutliningIndicators/None.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/InBlock.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/InBlock.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/InBlock.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/InBlock.gif)
126
![](/Images/OutliningIndicators/InBlock.gif)
127
![](/Images/OutliningIndicators/InBlock.gif)
128
![](/Images/OutliningIndicators/InBlock.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/InBlock.gif)
131
![](/Images/OutliningIndicators/InBlock.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/dot.gif)
140
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
141
![](/Images/OutliningIndicators/InBlock.gif)
142
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
143
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)