Exemple #1
0
 public void MainProcess()
 {
     while (true)
     {
         Monitor.Enter(rudp);
         UdpChunk c = rudp.RecvBuffOut();
         Monitor.Exit(rudp);
         if (c == null)
         {
             break;
         }
         if (c.size < 6)
         {
             break;
         }
         int  size  = NetTool.BytesToInt32(c.buff, 0);
         int  uid   = NetTool.BytesToInt32(c.buff, 4);
         int  msgid = NetTool.BytesToInt32(c.buff, 8);
         Type type  = UdpMsg.proto(msgid);
         if (type == null)
         {
             break;
         }
     }
 }
Exemple #2
0
    UdpChunk UpdSendBuffOut()
    {
        LinkedListNode <UdpChunk> n = sendQueue.First;

        if (n == null)
        {
            return;
        }
        UdpChunk c = n.Value;

        return(c);
    }
Exemple #3
0
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // PushQueueFront
    // AddFirst

    // PushQueueBack
    // AddLast

    // PushQueueAfter
    // AddAfter

    public void PushQueueBackSort(LinkedList <UdpChunk> q, UdpChunk c)
    {
        LinkedListNode <UdpChunk> n = q.Last;

        while (n != null)
        {
            if (n.Value.seq <= c.seq)
            {
                q.AddAfter(n, c);
                return;
            }
            n = n.Previous;
        }
        q.AddLast(c);
    }
Exemple #4
0
    void UdpSendBuffIn(byte[] buff, int size)
    {
        if (size > UdpConst.udpDataMaxLen)
        {
            return;
        }
        UdpChunk c = new UdpChunk();

        c.size = size;
        c.type = UdpConst.udpTypeData;
        c.seq  = ++sendSeq;
        c.ack  = recvMinSeq;
        Array.Copy(buff, c.buff, size);
        sendQueue.AddLast(c);
    }
Exemple #5
0
    void SendReqAgain()
    {
        if (recvMinSeq == recvMaxSeq)
        {
            return;
        }
        UdpChunk c = new UdpChunk();

        c.size = 0;
        c.type = UdpConst.udpTypeReqSeq;
        c.seq  = 0;
        c.ack  = recvMinSeq + 1;
        sendQueue.AddFirst(c);
        ++reqTimes;
    }
Exemple #6
0
    // UdpRecvBuffOut
    // UdpRecvBuffOutProcess

    public UdpChunk UdpRecvBuffOut()
    {
        LinkedListNode <UdpChunk> n = recvQueue.First;

        if (n == null)
        {
            return(null);
        }
        UdpChunk c = n.Value;

        if (c.seq <= recvMinSeq)
        {
            return(c);
        }
        return(null);
    }
Exemple #7
0
    // UdpRecvBuffIn

    // public void UdpRecvBuffInProcess(UdpChunk c, int sz) {
    //  if (c == null) {
    //      return;
    //  }
    //  if (sz < UdpConst.udpHeadByteAll ||
    //      sz > UdpConst.udpDataMaxLen + UdpConst.udpHeadByteAll) {
    //      return;
    //  }
    //  if (c.size + UdpConst.udpHeadByteAll != sz) {
    //      return;
    //  }

    //  switch (c.type) {
    //      case UdpConst.udpTypeReqSeq:
    //      {
    //          UdpChunk cAgain = PopQueueBySeq(sendHistory, c.ack);
    //          if (cAgain == null) {
    //              break;
    //          }
    //          sendQueue.AddFirst(cAgain);
    //      }
    //      case UdpConst.udpTypeSynAck:
    //          break;
    //      case UdpConst.udpTypeData:
    //      case UdpConst.udpTypeDataAgain:
    //          if (recvMinSeq >= c.seq) {
    //              break;
    //          }
    //          if (PushQueueBackSortCheckSame(recvQueue, c)) {
    //              // recv cur in
    //              if (recvMinSeq < c.seq) {
    //                  RecvMinSeqUpdate();
    //              }
    //              if (recvMaxSeq < c.seq) {
    //                  recvMaxSeq = c.seq;
    //              }
    //              if (recvMaxAck < c.ack) {
    //                  recvMaxAck = c.ack;
    //                  SendHistoryClear();
    //              }
    //              recvTick = curTick;
    //          }
    //  }
    // }

    public void UdpRecvBuffIn(UdpChunk c)
    {
        switch (c.type)
        {
        case UdpConst.udpTypeReqSeq:
        {
            UdpChunk cAgain = PopQueueBySeq(sendHistory, c.ack);
            if (cAgain == null)
            {
                break;
            }
            sendQueue.AddFirst(cAgain);
        }

        case UdpConst.udpTypeSynAck:
            break;

        case UdpConst.udpTypeData:
        case UdpConst.udpTypeDataAgain:
            if (recvMinSeq <= c.seq)
            {
                break;
            }
            if (PushQueueBackSortCheckSame(recvQueue, c))
            {
                // recv cur in = null
                if (recvMinSeq < c.seq)
                {
                    RecvMinSeqUpdate();
                }
                if (recvMaxSeq < c.seq)
                {
                    recvMaxSeq = c.seq;
                }
                if (recvMaxAck < c.ack)
                {
                    recvMaxAck = c.ack;
                    SendHistoryClear();
                }
                recvTick = curTick;
            }

        default:
            break;
        }
    }
Exemple #8
0
    public bool PushQueueBackSortCheckSame(LinkedList <UdpChunk> q, UdpChunk c)
    {
        LinkedListNode <UdpChunk> n = q.Last;

        while (n != null)
        {
            if (n.Value.seq == c.seq)
            {
                return(false);
            }
            if (n.Value.seq < c.seq)
            {
                q.AddAfter(n, c);
                return(true);
            }
            n = n.Previous;
        }
        q.AddLast(c);
        return(true);
    }
Exemple #9
0
 private void NetProcess()
 {
     byte[] sendBuff = new byte[1024];
     byte[] recvBuff = new byte[1024];
     while (true)
     {
         do
         {
             if (clientSocket == null)
             {
                 break;
             }
             if (!clientSocket.poll(0, SelectMode.SelectRead))
             {
                 break;
             }
             int len = clientSocket.ReceiveFrom(recvBuff, ref serverPoint);
             if (len <= 0)
             {
                 break;
             }
             if (len < UdpConst.udpHeadByteAll)
             {
                 break;
             }
             int size = NetTool.BytesToInt8(ref recvBuff, 0);
             if (len < size + UdpConst.udpHeadByteAll)
             {
                 break;
             }
             UdpChunk c = new UdpChunk();
             c.size = NetTool.BytesToInt8(ref recvBuff, 0);
             c.type = NetTool.BytesToInt8(ref recvBuff, 1);
             c.seq  = NetTool.BytesToInt32(ref recvBuff, 2);
             c.ack  = NetTool.BytesToInt32(ref recvBuff, 6);
             Array.Copy(recvBuff, 10, c.buff, 0, c.size);
             Monitor.Enter(rudp);
             rudp.RecvBuffIn(c);
             Monitor.Exit(rudp);
         } while (false);
         do
         {
             if (clientSocket == null)
             {
                 break;
             }
             Monitor.Enter(rudp);
             UdpChunk c = rudp.SendBuffOut();
             Monitor.Exit(rudp);
             if (c == null)
             {
                 break;
             }
             if (!clientSocket.poll(0, SelectMode.SelectWrite))
             {
                 Monitor.Enter(rudp);
                 UdpChunk c = rudp.SendChunkForce(c);
                 Monitor.Exit(rudp);
                 break;
             }
             NetTool.Int8ToBytes(sendBuff, 0, c.size);
             NetTool.Int8ToBytes(sendBuff, 1, c.type);
             NetTool.Int32ToBytes(sendBuff, 2, c.seq);
             NetTool.Int32ToBytes(sendBuff, 6, c.ack);
             Array.Copy(c.buff, 0, sendBuff, 10, c.size);
             int dataLen = c.size + UdpConst.udpHeadByteAll;
             int len     = clientSocket.SendTo(sendBuff, dataLen, SocketFlags.None, serverPoint);
             if (len < dataLen)
             {
                 Monitor.Enter(rudp);
                 UdpChunk c = rudp.SendChunkForce(c);
                 Monitor.Exit(rudp);
             }
         } while (false);
         Thread.Sleep(10);
     }
 }