TCP-сокет BeginReceive, предоставляющий мне данные сокета в порядке - PullRequest
3 голосов
/ 22 апреля 2011

Я связываюсь с последовательным портом на терминальном сервере, поэтому важна гарантия заказа.По словам 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...