Я связываюсь с последовательным портом на терминальном сервере, поэтому важна гарантия заказа.По словам Wireshark, пакеты поступают в порядке.Последовательности также хороши.
Но мой буфер, в который я пишу с помощью асинхронного обратного вызова, иногда, не всегда, получает пакетные данные не в порядке.Я думал, что TCP гарантирован при получении данных в порядке?
В приведенном ниже коде, в самом низу, это InputBuffer, который иногда выводит данные из строя.Что происходит?
private void WaitForData()
{
try
{
if (moCallBack == null)
{
moCallBack = new AsyncCallback(OnDataReceived);
}
SocketPacket theSocPkt = new SocketPacket();
theSocPkt.thisSocket = moClientSocket;
moResult = moClientSocket.BeginReceive(theSocPkt.dataBuffer,
0, theSocPkt.dataBuffer.Length,
SocketFlags.None,
moCallBack,
theSocPkt);
}
private void OnDataReceived(IAsyncResult asyn)
{
try
{
//Set up socket data
SocketPacket socketData = (SocketPacket)asyn.AsyncState;
int iRx = socketData.thisSocket.EndReceive(asyn);
if (iRx > 0 && this.modemState.State != MODEM_CONN_STATE.DISCONNECTED)
{
byte[] bytes = new byte[iRx];
bytes = socketData.dataBuffer;
Array.Resize<byte>(ref bytes, iRx);
this.HayesBuff.AddRange(bytes);
modemConnSMachine();
WaitForData();
}
}
}
private void modemConnSMachine()
{
switch (modemState.State)
{
case MODEM_CONN_STATE.CONNECTED:
switch(chkModResp(this.HayesBuff))
{
case MODEM_RESPONSE.DATA:
signConnectionTimeoutTimer.Change(noChatsTimeoutSec, noChatsTimeoutSec);
lock (this.InputBuffer)
{
this.InputBuffer.AddRange(this.HayesBuff);
this.HayesBuff.RemoveRange(0, HayesBuff.Count);
}
break;