为Socket写的附加方法

来源:互联网 发布:网络音乐提供商潘多拉 编辑:程序博客网 时间:2024/05/30 04:27

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

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

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

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

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

 测试代码如下:

 

#include "stdafx.h" 2 3#using  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);1415    Byte btSizeBuffer[]=Text::Encoding::ASCII->GetBytes(strSize);1617    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};242526Byte 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);3233    Byte btRealMessage[]=new Byte[Convert::ToInt32(strSize)];34    Array::Copy(btPackedMessage,ADDITIONINFO,btRealMessage,0,Convert::ToInt32(strSize));35    36    return btRealMessage;37}3839int _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:");4647    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();636465    return 0;66}
 

这个是用C++Managed写的.