C# Socket?????????????
?????С?? ???????[ 2017/5/23 9:17:02 ] ??????????????????? C# Socket
????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????????????????л?????????
??????
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11