コード例 #1
0
        private Packet processAnswer(Packet client_packet)
        {
            UpdateTextBox2Callback tb2 = new UpdateTextBox2Callback(updateTextBox2);
            byte pck_id = client_packet.getPCK_ID();

            switch (pck_id)
            {
            case 0x01:
                Packet sp1 = new Packet();
                sp1.init_SERVER_P1(packet_cnt++, client_packet.getPCK_ID(), client_packet.getPCK_CNT());
                return(sp1);

            case 0x03:
                Packet sp2 = new Packet();
                sp2.init_SERVER_P2(packet_cnt++, client_packet.getPCK_ID(), client_packet.getPCK_CNT(), (byte)0xCD);
                return(sp2);

            case 0x05:
                Packet sp3       = new Packet();
                byte[] more_data = new byte[3] {
                    0x04, 0x05, 0x06
                };
                sp3.init_SERVER_P3(packet_cnt++, client_packet.getPCK_ID(), client_packet.getPCK_CNT(), more_data);
                return(sp3);

            case 0x07:
                Packet sp4        = new Packet();
                byte[] more_data4 = new byte[5] {
                    0x01, 0x02, 0x03, 0x04, 0x05
                };
                sp4.init_SERVER_P4(packet_cnt++, client_packet.getPCK_ID(), client_packet.getPCK_CNT(), more_data4);
                return(sp4);

            default:
                this.Invoke(tb2, new object[] { "UNKNOWN CLIENT PACKET ID" });
                break;
            }

            return(null);
        }
        private void accept_n_process()
        {
            UpdateTextBox1Callback tb1 = new UpdateTextBox1Callback(updateTextBox1);
            UpdateTextBox2Callback tb2 = new UpdateTextBox2Callback(updateTextBox2);

            this.Invoke(tb1, new object[] { "accept_n_process started" });
            this.Invoke(tb2, new object[] { "accept_n_process started" });

            TcpClient client = null;

            try
            {
                while (srvRunning == true)
                {

                    client = server.AcceptTcpClient();
                    
                    Socket soc = client.Client;
                    soc.SendTimeout = 10000;
                    soc.ReceiveTimeout = 10000;
                    soc.NoDelay = true;

                    byte b = (byte)0x00;
                    byte[] data = new byte[1];
                    int bytes = 0;
                    int counter = 0;
                    ushort sizeOfReceivingFrame = (ushort)0x0000;
                    ushort rxCRC = (ushort)0x0000;
                    ushort crc = (ushort)0x0000;
                    byte crc_hb = (byte)0x00;
                    byte crc_lb = (byte)0x00;
                    bool pck_error = false;
                    bool rxOK = false;
                    bool crc_error = false;
                    bool end_error = false;
                    bool rx_len_error = false;
                    byte[] rxPacket = new byte[512];//cia tik atvaizdavimui reikalinga!
                    int idx = 0;

                    RX_STATE rxState = RX_STATE.WAIT_FOR_SYNC;

                    while ((pck_error == false && rxOK == false && (bytes = soc.Receive(data, 1, 0)) > 0))
                    {
                        //this.Invoke(tb1, new object[] { "byte received, bytes_size=" + bytes });

                        b = (byte)data[0];
                        switch (rxState)
                        {
                            case RX_STATE.WAIT_FOR_SYNC:
                                if (b != (byte)0x4D && b != (byte)0x61 && b != (byte)0x72)
                                {
                                    counter = 0;
                                    break;
                                }

                                counter++;
                                rxPacket[idx++] = b;

                                if (counter == 3)
                                {
                                    counter = 0;
                                    rxState = RX_STATE.RX_LENGTH;
                                }
                                break;
                            case RX_STATE.RX_LENGTH:
                                counter++;

                                if (counter == 1)
                                {
                                    sizeOfReceivingFrame = b;
                                    rxPacket[idx++] = b;
                                    break;
                                }

                                if (counter == 2)
                                {
                                    counter = 0;
                                    sizeOfReceivingFrame = (ushort)((sizeOfReceivingFrame << 8) | b);
                                    sizeOfReceivingFrame -= 4;// atmetam CRC ir END
                                    if (sizeOfReceivingFrame <= 0)
                                    {
                                        pck_error = true;
                                        rx_len_error = true;
                                        this.Invoke(tb1, new object[] { "RX_STATE.RX_LENGTH: pck_error" });
                                        break;
                                    }
                                    rxPacket[idx++] = b;
                                    rxState = RX_STATE.RX_DATA;
                                    break;
                                }
                                break;
                            case RX_STATE.RX_DATA:
                                rxPacket[idx++] = b;
                                counter++;
                                if (counter == sizeOfReceivingFrame)
                                {
                                    counter = 0;
                                    rxState = RX_STATE.RX_CRC;
                                    break;
                                }
                                break;
                            case RX_STATE.RX_CRC:
                                counter++;
                                if (counter == 1)
                                {
                                    crc_hb = b;
                                    rxPacket[idx++] = b;
                                    break;
                                }

                                if (counter == 2)
                                {
                                    crc_lb = b;
                                    rxPacket[idx++] = b;
                                    counter = 0;

                                    crc = (ushort)((crc_hb << 8) | crc_lb);

                                    rxCRC = calcCRC(rxPacket, idx);

                                    //Debug.WriteLine("server crc " + crc);
                                    //Debug.WriteLine("rxcrc" + rxCRC);

                                    if (crc != rxCRC)
                                    {
                                        this.Invoke(tb1, new object[] { "Server BAD CRC: calcCRC=" + word2hexstr(rxCRC) + " | crc=" + word2hexstr(crc) });
                                        this.Invoke(tb1, new object[] { "packet: " + toHexString(rxPacket) });
                                        pck_error = true;
                                        crc_error = true;
                                    }
                                    else
                                    {
                                        rxState = RX_STATE.RX_END;
                                        counter = 0;//
                                    }

                                    break;
                                }
                                break;
                            case RX_STATE.RX_END:
                                //   counter = 0;
                                if (b != (byte)0x56 && b != (byte)0x61)   // discard
                                {
                                    this.Invoke(tb1, new object[] { "MISSING END! ..." });
                                    this.Invoke(tb1, new object[] { "packet discarded: " + toHexString(rxPacket) });
                                    pck_error = true;
                                    end_error = true;
                                }
                                counter++;
                                rxPacket[idx++] = b;

                                if (counter == 2)
                                {
                                    rxPacket[idx++] = b;
                                    rxOK = true;
                                }

                                // 

                                break;
                        }
                    }

                    if (rxOK == true) // response
                    {
                        byte[] p = new byte[idx];
                        Array.Copy(rxPacket, p, idx);
                        Packet client_packet = new Packet();
                        client_packet.setPacket(p);
                        this.Invoke(tb1, new object[] { "OK: packet=" + client_packet.toHexString() });

                        Packet server_packet = processAnswer(client_packet);

                        if (server_packet != null)
                        {
                            soc.Send(server_packet.getRawPacket(), server_packet.getRawPacket().Length, 0);
                            this.Invoke(tb2, new object[] { "packet=" + server_packet.toHexString() });
                        }
                        else
                            this.Invoke(tb2, new object[] { "failed at processAnswer(): server_packet = null" });
                    }
                    else
                    {
                        this.Invoke(tb1, new object[] { "RX failed" });
                    }

                    client.Close();
                    this.Invoke(tb1, new object[] { "Connection closed" });
                }
            }
            catch (SocketException ex)
            {
                this.Invoke(tb1, new object[] { ex.Message });
                this.Invoke(tb2, new object[] { ex.Message });
                client.Close();
                this.Invoke(tb1, new object[] { "Connection closed after SocketException" });
            }
            catch (Exception exx)
            {
                this.Invoke(tb1, new object[] { exx.Message });
                this.Invoke(tb2, new object[] { exx.Message });
                client.Close();
                this.Invoke(tb1, new object[] { "Connection closed after Exception" });
            }

        }
        private Packet processAnswer(Packet client_packet)
        {
            UpdateTextBox2Callback tb2 = new UpdateTextBox2Callback(updateTextBox2);
            byte pck_id = client_packet.getPCK_ID();

            switch (pck_id)
            {
                case 0x05:
                    Packet sp3 = new Packet();
                    string hexString = "7c423d5858"; //data
                    byte[] more_data = Packet.StringToByteArray(hexString); //data
                    sp3.init_SERVER_P3(packet_cnt++, client_packet.getPCK_ID(), client_packet.getPCK_CNT(), more_data);
                    return sp3;
                default:
                    this.Invoke(tb2, new object[] { "UNKNOWN CLIENT PACKET ID" });
                    break;
            }

            return null;
        }
コード例 #4
0
        private void accept_n_process()
        {
            UpdateTextBox1Callback tb1 = new UpdateTextBox1Callback(updateTextBox1);
            UpdateTextBox2Callback tb2 = new UpdateTextBox2Callback(updateTextBox2);

            this.Invoke(tb1, new object[] { "accept_n_process started" });
            this.Invoke(tb2, new object[] { "accept_n_process started" });

            TcpClient client = null;

            try
            {
                while (srvRunning == true)
                {
                    client = server.AcceptTcpClient();

                    Socket soc = client.Client;
                    soc.SendTimeout    = 10000;
                    soc.ReceiveTimeout = 10000;
                    soc.NoDelay        = true;

                    byte   b       = (byte)0x00;
                    byte[] data    = new byte[1];
                    int    bytes   = 0;
                    int    counter = 0;
                    ushort sizeOfReceivingFrame = (ushort)0x0000;
                    ushort rxCRC        = (ushort)0x0000;
                    ushort crc          = (ushort)0x0000;
                    byte   crc_hb       = (byte)0x00;
                    byte   crc_lb       = (byte)0x00;
                    bool   pck_error    = false;
                    bool   rxOK         = false;
                    bool   crc_error    = false;
                    bool   end_error    = false;
                    bool   rx_len_error = false;
                    byte[] rxPacket     = new byte[512];//cia tik atvaizdavimui reikalinga!
                    int    idx          = 0;

                    RX_STATE rxState = RX_STATE.WAIT_FOR_SYNC;

                    while ((pck_error == false && rxOK == false && (bytes = soc.Receive(data, 1, 0)) > 0))
                    {
                        //this.Invoke(tb1, new object[] { "byte received, bytes_size=" + bytes });
                        int a = 0;
                        b = (byte)data[0];
                        switch (rxState)
                        {
                        case RX_STATE.WAIT_FOR_SYNC:
                            if (b != (byte)0x21)
                            {
                                counter = 0;
                                break;
                            }

                            counter++;
                            rxPacket[idx++] = b;

                            if (counter == 2)
                            {
                                counter = 0;
                                rxState = RX_STATE.RX_LENGTH;
                            }
                            break;

                        case RX_STATE.RX_LENGTH:
                            counter++;

                            if (counter == 1)
                            {
                                sizeOfReceivingFrame = b;
                                rxPacket[idx++]      = b;
                                break;
                            }

                            if (counter == 2)
                            {
                                counter = 0;
                                sizeOfReceivingFrame  = (ushort)((sizeOfReceivingFrame << 8) | b);
                                sizeOfReceivingFrame -= 3;    // atmetam CRC ir END
                                if (sizeOfReceivingFrame <= 0)
                                {
                                    pck_error    = true;
                                    rx_len_error = true;
                                    this.Invoke(tb1, new object[] { "RX_STATE.RX_LENGTH: pck_error" });
                                    break;
                                }
                                rxPacket[idx++] = b;
                                rxState         = RX_STATE.RX_DATA;
                                break;
                            }
                            break;

                        case RX_STATE.RX_DATA:
                            rxPacket[idx++] = b;
                            counter++;
                            if (counter == sizeOfReceivingFrame)
                            {
                                counter = 0;
                                rxState = RX_STATE.RX_CRC;
                                break;
                            }
                            break;

                        case RX_STATE.RX_CRC:
                            counter++;
                            if (counter == 1)
                            {
                                crc_hb          = b;
                                rxPacket[idx++] = b;
                                break;
                            }

                            if (counter == 2)
                            {
                                crc_lb          = b;
                                rxPacket[idx++] = b;
                                counter         = 0;

                                crc = (ushort)((crc_hb << 8) | crc_lb);

                                rxCRC = calcCRC(rxPacket, idx);

                                if (crc != rxCRC)
                                {
                                    this.Invoke(tb1, new object[] { "BAD CRC: calcCRC=" + word2hexstr(rxCRC) + " | crc=" + word2hexstr(rxCRC) });
                                    this.Invoke(tb1, new object[] { "packet: " + toHexString(rxPacket) });
                                    pck_error = true;
                                    crc_error = true;
                                }
                                else
                                {
                                    rxState = RX_STATE.RX_END;
                                }

                                break;
                            }
                            break;

                        case RX_STATE.RX_END:
                            counter = 0;
                            if (b != (byte)0x2E)       // discard
                            {
                                this.Invoke(tb1, new object[] { "MISSING END! ..." });
                                this.Invoke(tb1, new object[] { "packet discarded: " + toHexString(rxPacket) });
                                pck_error = true;
                                end_error = true;
                            }
                            else
                            {
                                //this.Invoke(tb1, new object[] { "rxOK! ..." });
                                rxPacket[idx++] = b;
                                rxOK            = true;
                            }

                            //

                            break;
                        }
                    }

                    if (rxOK == true) // response
                    {
                        byte[] p = new byte[idx];
                        Array.Copy(rxPacket, p, idx);
                        Packet client_packet = new Packet();
                        client_packet.setPacket(p);
                        this.Invoke(tb1, new object[] { "OK: packet=" + client_packet.toHexString() });

                        Packet server_packet = processAnswer(client_packet);

                        if (server_packet != null)
                        {
                            soc.Send(server_packet.getRawPacket(), server_packet.getRawPacket().Length, 0);
                            this.Invoke(tb2, new object[] { "packet=" + server_packet.toHexString() });
                        }
                        else
                        {
                            this.Invoke(tb2, new object[] { "failed at processAnswer(): server_packet = null" });
                        }
                    }
                    else
                    {
                        this.Invoke(tb1, new object[] { "RX failed" });
                    }

                    client.Close();
                    this.Invoke(tb1, new object[] { "Connection closed" });
                }
            }
            catch (SocketException ex)
            {
                this.Invoke(tb1, new object[] { ex.Message });
                this.Invoke(tb2, new object[] { ex.Message });
                client.Close();
                this.Invoke(tb1, new object[] { "Connection closed after SocketException" });
            }
            catch (Exception exx)
            {
                this.Invoke(tb1, new object[] { exx.Message });
                this.Invoke(tb2, new object[] { exx.Message });
                client.Close();
                this.Invoke(tb1, new object[] { "Connection closed after Exception" });
            }
        }