为Socket写的附加方法

 自己封装了一个.Net的异步socket
 在Server端写了一个对象池来提供服务.

 然后为在网络中传递的数据写了一个Pack和Unpack方法.
 打算放到Socket类中

 基本的思路是:在Send以前调用PackMessage
 在Message(以Byte数组的方式存在)前面加上一些附加信息.
 例如发送的消息字节数.

 然后在Receive端接收打了包的字节流,解析出Pack在前面的大小信息.
 再根据这个大小判断是否接收到完整的数据.

 还可以写得更复杂,加上一些别的东西.
 但暂时就是这样,也觉得代码写得不好...最近好象没有什么状态.

 测试代码如下:

 

 1#include "stdafx.h"
 2
 3#using <mscorlib.dll>
 4
 5using namespace System;
 6const int ADDITIONINFO=10;
 7
 8Byte 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
26Byte 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
39int _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写的.
原文地址:https://www.cnblogs.com/BearOcean/p/313317.html