为Socket写的附加方法
自己封装了一个.Net的异步socket
在Server端写了一个对象池来提供服务.
然后为在网络中传递的数据写了一个Pack和Unpack方法.
打算放到Socket类中
基本的思路是:在Send以前调用PackMessage
在Message(以Byte数组的方式存在)前面加上一些附加信息.
例如发送的消息字节数.
然后在Receive端接收打了包的字节流,解析出Pack在前面的大小信息.
再根据这个大小判断是否接收到完整的数据.
还可以写得更复杂,加上一些别的东西.
但暂时就是这样,也觉得代码写得不好...最近好象没有什么状态.
测试代码如下:
1
#include "stdafx.h"
2![]()
3
#using <mscorlib.dll>
4![]()
5
using namespace System;
6
const int ADDITIONINFO=10;
7![]()
8
Byte PackMessage(String * message) []
9
{
10
Byte btRealMessage[]=Text::Encoding::ASCII->GetBytes(message);
11
int iSize=btRealMessage->Length;
12
String *strSize=iSize.ToString();
13
Console::WriteLine("RealMessage Length:{0}",strSize);
14![]()
15
Byte btSizeBuffer[]=Text::Encoding::ASCII->GetBytes(strSize);
16![]()
17
Byte btAdditionInfo[]=new Byte[ADDITIONINFO];
18
Array::Copy(btSizeBuffer,0,btAdditionInfo,0,btSizeBuffer->Length);
19
Byte btPackedMessage[]=new Byte[ADDITIONINFO+iSize];
20
Array::Copy(btAdditionInfo,0,btPackedMessage,0,ADDITIONINFO);
21
Array::Copy(btRealMessage,0,btPackedMessage,ADDITIONINFO,iSize);
22
return btPackedMessage;
23
};
24![]()
25![]()
26
Byte UnPackMessage(Byte btPackedMessage[])[]
27
{
28
Byte btSize[]=new Byte[ADDITIONINFO];
29
Array::Copy(btPackedMessage,0,btSize,0,ADDITIONINFO);
30
String *strSize=Text::Encoding::ASCII->GetString(btSize);
31
Console::WriteLine("The message Length is {0}",strSize);
32![]()
33
Byte btRealMessage[]=new Byte[Convert::ToInt32(strSize)];
34
Array::Copy(btPackedMessage,ADDITIONINFO,btRealMessage,0,Convert::ToInt32(strSize));
35
36
return btRealMessage;
37
}
38![]()
39
int _tmain()
40
{
41
// TODO: 请用您自己的代码替换下面的示例代码。
42
Console::WriteLine("Please input Message:");
43
String *buffer=Console::ReadLine();
44
Byte btResult[]=PackMessage(buffer);
45
Console::WriteLine("The message after pack is:");
46![]()
47
System::Collections::IEnumerator* myEnumerator = btResult->GetEnumerator();
48
while ( myEnumerator->MoveNext() )
49
{
50
Console::Write( "-{0}", myEnumerator->Current );
51
}
52
Console::WriteLine();
53
54
Byte realMessage[]=UnPackMessage(btResult);
55
56
Console::WriteLine("The Message after unpack is:");
57
System::Collections::IEnumerator* myEnumerator1 = realMessage->GetEnumerator();
58
while ( myEnumerator1->MoveNext() )
59
{
60
Console::Write( "-{0}", myEnumerator1->Current );
61
}
62
Console::WriteLine();
63![]()
64![]()
65
return 0;
66
}
67![]()
#include "stdafx.h"2

3
#using <mscorlib.dll>4

5
using namespace System;6
const int ADDITIONINFO=10;7

8
Byte PackMessage(String * message) []9
{10
Byte btRealMessage[]=Text::Encoding::ASCII->GetBytes(message);11
int iSize=btRealMessage->Length;12
String *strSize=iSize.ToString();13
Console::WriteLine("RealMessage Length:{0}",strSize);14

15
Byte btSizeBuffer[]=Text::Encoding::ASCII->GetBytes(strSize);16

17
Byte btAdditionInfo[]=new Byte[ADDITIONINFO];18
Array::Copy(btSizeBuffer,0,btAdditionInfo,0,btSizeBuffer->Length);19
Byte btPackedMessage[]=new Byte[ADDITIONINFO+iSize];20
Array::Copy(btAdditionInfo,0,btPackedMessage,0,ADDITIONINFO);21
Array::Copy(btRealMessage,0,btPackedMessage,ADDITIONINFO,iSize);22
return btPackedMessage;23
};24

25

26
Byte UnPackMessage(Byte btPackedMessage[])[]27
{28
Byte btSize[]=new Byte[ADDITIONINFO];29
Array::Copy(btPackedMessage,0,btSize,0,ADDITIONINFO);30
String *strSize=Text::Encoding::ASCII->GetString(btSize);31
Console::WriteLine("The message Length is {0}",strSize);32

33
Byte btRealMessage[]=new Byte[Convert::ToInt32(strSize)];34
Array::Copy(btPackedMessage,ADDITIONINFO,btRealMessage,0,Convert::ToInt32(strSize));35
36
return btRealMessage;37
}38

39
int _tmain()40
{41
// TODO: 请用您自己的代码替换下面的示例代码。42
Console::WriteLine("Please input Message:");43
String *buffer=Console::ReadLine();44
Byte btResult[]=PackMessage(buffer);45
Console::WriteLine("The message after pack is:");46

47
System::Collections::IEnumerator* myEnumerator = btResult->GetEnumerator();48
while ( myEnumerator->MoveNext() )49
{50
Console::Write( "-{0}", myEnumerator->Current );51
}52
Console::WriteLine();53
54
Byte realMessage[]=UnPackMessage(btResult);55
56
Console::WriteLine("The Message after unpack is:");57
System::Collections::IEnumerator* myEnumerator1 = realMessage->GetEnumerator();58
while ( myEnumerator1->MoveNext() )59
{60
Console::Write( "-{0}", myEnumerator1->Current );61
}62
Console::WriteLine();63

64

65
return 0;66
}67

这个是用C++Managed写的.



浙公网安备 33010602011771号