private void button3_Click(object sender, EventArgs e) { Packet cp = new Packet(); string hexString = "7c423d5858"; //data byte[] more_data = Packet.StringToByteArray(hexString); //data cp.init_CLIENT_P3(packet_cnt++, more_data); this.textBox1.Text = "Packet: " + cp.toHexString() + "\r\n"; this.textBox1.Text += "------------------------------------------" + "\r\n"; this.textBox1.Text += "PCK_SIZE = " + cp.getPCK_SIZE() + " (" + cp.getPCK_SIZE_HexString() + ")" + "\r\n"; this.textBox1.Text += "PCK_CNT = " + cp.getPCK_CNT() + " (" + cp.getPCK_CNT_HexString() + ")" + "\r\n"; this.textBox1.Text += "PCK_ID = " + cp.getPCK_ID() + " (" + cp.getPCK_ID_HexString() + ")" + "\r\n"; this.textBox1.Text += "PCK_CRC = " + cp.getPCK_CRC_HexString() + "\r\n"; this.textBox1.Text += "------------------------------------------" + "\r\n"; SendThread st = new SendThread(cp.getRawPacket(), this, this.textBoxIP.Text); Thread t = new Thread(new ThreadStart(st.ThreadProc)); t.Start(); }
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" }); } }
public void ThreadProc() { Form1.UpdateTextBox1Callback tb1 = new Form1.UpdateTextBox1Callback(form.updateTextBox1); Form1.UpdateTextBox2Callback tb2 = new Form1.UpdateTextBox2Callback(form.updateTextBox2); form.Invoke(tb1, new object[] { "sendPacketToServer() started" }); TcpClient client = new TcpClient(); try { form.Invoke(tb1, new object[] { "Connecting..." }); client.Connect(server_ip, 7777); Socket soc = client.Client; soc.SendTimeout = 10000; soc.ReceiveTimeout = 10000; soc.NoDelay = true; form.Invoke(tb1, new object[] { "Connected" }); soc.Send(pck_data, pck_data.Length, 0); form.Invoke(tb1, new object[] { "Data sent, waiting for response..." }); 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 crc_error = false; bool end_error = false; bool rx_len_error = false; bool rxOK = 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)) { //form.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; form.Invoke(tb2, 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++; // Debug.WriteLine("size of receiving frame: " + sizeOfReceivingFrame); 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("crc "+ crc); Debug.WriteLine("rxcrc" + rxCRC); if (crc != rxCRC) { form.Invoke(tb2, new object[] { "Client BAD CRC: calcCRC=" + word2hexstr(rxCRC) + " | crc=" + word2hexstr(crc) }); form.Invoke(tb2, 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 { form.Invoke(tb2, new object[] { "MISSING END! ..." }); form.Invoke(tb2, 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) { byte[] p = new byte[idx]; Array.Copy(rxPacket, p, idx); Packet server_packet = new Packet(); server_packet.setPacket(p); form.Invoke(tb2, new object[] { "OK: packet=" + server_packet.toHexString() }); } else { form.Invoke(tb2, new object[] { "RX failed" }); } client.Close(); form.Invoke(tb1, new object[] { "Closed" }); } catch (Exception ex) { form.Invoke(tb2, new object[] { ex.Message }); client.Close(); } }