????C# Socket??????????????????????????
?????????????н???????????????????????????У??????????????????Ч??????????????????????и??????弼???淶
????C# Socket???????????????????????????
??????TCP/IP??????У??????????????????????Socket?????λ??ν?????????????????????????浽TSession??DatagramBuffer?У?????????????
????C# Socket?????????????????????????
????????????????????豸??????????ν???????????????????????????????????????????????????
???????????BeginReceive()???????EndReceiveData()?е????????????ResolveBuffer()??
??????????C# Socket????????????????????
/// ?summary?
/// 1) ????????????????????????????
/// 2) ?????????????????????????????????
/// 3) ?????????????????? DatagramBuffer ???
/// 4) ??????浽????????? session.DatagramBuffer
/// ?/summary?
private void ResolveBuffer(TSession session??  int receivedSize)
{
// ??????μ??????????????????????п????? ?????????? ???
bool hasBeginChar = (session.DatagramBufferLength ? 0);
int packPos = 0;   // ReceiveBuffer ???????а?????λ??
int packLen = 0;   // ???????????????????С
byte dataByte = 0;   // ?????????
int subIndex = 0;    // ???????±?
while (subIndex ? receivedSize)
{
// ???????????????????????? session.DatagramBuffer ??????
dataByte = session.ReceiveBuffer[subIndex];
if (dataByte == TDatagram.BeginChar)  // ????????????????????????????????
{
// ?????з????????????????????????????????????? AAA?A??1??A? ??????????ζ?????
if (packLen ? 0)
{
Interlocked.Increment( ref _datagramCount);   // ????з?????
Interlocked.Increment( ref _errorDatagramCount);   // ????????
this .OnDatagramError();
}
session.ClearDatagramBuffer();   // ???????????????????°?
packPos = subIndex;    // ?°???????????λ??
packLen = 1; // ?°????????????
hasBeginChar =  true ;   // ?°??п?????
}
else if (dataByte == TDatagram.EndChar)   // ????????????? ?
{
if (hasBeginChar)   // ?????????????п??????
{
++packLen;   // ???????????????
// ???????????????????????e?????????????????
AnalyzeOneDatagram(session?? packPos?? packLen);
packPos = subIndex + 1;   // ?°???????subIndex ??????? + 1
packLen = 0;    // ?°?????
}
else // ??????п?????????????????????????????????????????????
{
++packLen;   //  hasBeginChar = false;
}
}
else // ???????????????????????????? + 1??????????????
{
++packLen;
}
++subIndex;   // ?????±??
}   // end while
if (packLen ? 0)   // ??μ??????????????????
{
// ??°???????????????????????????浽??????????У????′δ???
if (hasBeginChar && packLen +
session.DatagramBufferLength ?= _maxDatagramSize)
{
session.CopyToDatagramBuffer(packPos?? packLen);
}
else // ???????????????
{
Interlocked.Increment( ref _datagramCount);
Interlocked.Increment( ref _errorDatagramCount);
this .OnDatagramError();
session.ClearDatagramBuffer();   // ???????????
}
}
}
????C# Socket????????????????????AnalyzeOneDatagram()?????????????£?
/// ?summary?
/// ??????????????????????????
/// ?/summary?
private void AnalyzeOneDatagram(
TSession session??  int packPos??  int packLen)
{
if (packLen + session.DatagramBufferLength ? _maxDatagramSize)
// ????????????
{
Interlocked.Increment( ref _datagramCount);
Interlocked.Increment( ref _errorDatagramCount);
this .OnDatagramError();
}
else // ?????β??????????????????ж???????
{
Interlocked.Increment( ref _datagramCount);
TDatagram datagram =  new TDatagram();
if (!datagram.CheckDatagramKind())
// ?????????????????BG??????SG????
{
Interlocked.Increment( ref _datagramCount);
Interlocked.Increment( ref _errorDatagramCount);
this .OnDatagramError();
datagram =  null ;   // ?????????
}
else // ????????????????????????ж???????????????
{
datagram.ResolveDatagram();
if ( true )   // ???????????????
{
Interlocked.Increment( ref _datagramQueueCount);
lock (_datagramQueue)
{
_datagramQueue.Enqueue(datagram);   // ??????????
}
}
else
{
Interlocked.Increment( ref _errorDatagramCount);
this .OnDatagramError();
}
}
}
session.ClearDatagramBuffer();   // ??????????
}
????C# Socket????????????TSession???????????????????CopyToDatagramBuffer()???????£?
/// ?summary?
/// ???????????????????????????????????ζ?????????
/// ?/summary?
public void CopyToDatagramBuffer( int startPos??  int packLen)
{
int datagramLen = 0;
if (DatagramBuffer !=  null ) datagramLen =
DatagramBuffer.Length;
// ?????????DataBuffer ? null ????????
Array.Resize( ref DatagramBuffer??
datagramLen + packLen);
// ???????????????
Array.Copy(ReceiveBuffer?? startPos??
DatagramBuffer?? datagramLen?? packLen);
}
????????????????????????????C# Socket???????????????????·??
???????TSession??????????????ReceiveBuffer????BeginReceiver()??????????????????????DatagramBuffer??????ν?????????????μ???????????У???????5???????????????????2???????DatagramBuffer????
????????ReceiveBuffer?е?????????????????DatagramBuffer????п????????????У??????????????????????????????????????????????????????????????????У???????????AnalyzeOneDatagram()
??????????????????????μ???浽DatagramBuffer?У???????CopyToDatagramBuffer()
??????????????????????????????????????????????100???????5*60=300??????100?????????3??????????????????????????????????????????????ж??????????????????豸????????????????????????????????????????????????????????ν?????????????????????????????????????????к????????????????????????EI???????????????????????????????????????????????????????????????????????????
???????У?????.NET Framework???й?CLR?£????????????????Σ?????????а?????????????????????????????????????????????????????????????????????????????????????
????C# Socket???????????????????????????????????????????????C# Socket?????????????????????
??????????socket????????????????л?????????