765 lines
33 KiB
C++
765 lines
33 KiB
C++
|
/***************************************************************
|
||
|
* Name: tcptestMain.cpp
|
||
|
* Purpose: Code for Application Frame
|
||
|
* Author: ()
|
||
|
* Created: 2023-11-10
|
||
|
* Copyright: ()
|
||
|
* License:
|
||
|
**************************************************************/
|
||
|
|
||
|
#include "tcptestMain.h"
|
||
|
#include <wx/msgdlg.h>
|
||
|
|
||
|
//(*InternalHeaders(tcptestFrame)
|
||
|
#include <wx/intl.h>
|
||
|
#include <wx/settings.h>
|
||
|
#include <wx/string.h>
|
||
|
//*)
|
||
|
|
||
|
//helper functions
|
||
|
enum wxbuildinfoformat {
|
||
|
short_f, long_f };
|
||
|
|
||
|
wxString wxbuildinfo(wxbuildinfoformat format)
|
||
|
{
|
||
|
wxString wxbuild(wxVERSION_STRING);
|
||
|
|
||
|
if (format == long_f )
|
||
|
{
|
||
|
#if defined(__WXMSW__)
|
||
|
wxbuild << _T("-Windows");
|
||
|
#elif defined(__UNIX__)
|
||
|
wxbuild << _T("-Linux");
|
||
|
#endif
|
||
|
|
||
|
#if wxUSE_UNICODE
|
||
|
wxbuild << _T("-Unicode build");
|
||
|
#else
|
||
|
wxbuild << _T("-ANSI build");
|
||
|
#endif // wxUSE_UNICODE
|
||
|
}
|
||
|
|
||
|
return wxbuild;
|
||
|
}
|
||
|
|
||
|
//(*IdInit(tcptestFrame)
|
||
|
const long tcptestFrame::ID_STATICTEXT3 = wxNewId();
|
||
|
const long tcptestFrame::ID_STATICTEXT4 = wxNewId();
|
||
|
const long tcptestFrame::ID_TEXTCTRL2 = wxNewId();
|
||
|
const long tcptestFrame::ID_BUTTON1 = wxNewId();
|
||
|
const long tcptestFrame::ID_BUTTON2 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL5 = wxNewId();
|
||
|
const long tcptestFrame::ID_STATICTEXT1 = wxNewId();
|
||
|
const long tcptestFrame::ID_LISTBOX1 = wxNewId();
|
||
|
const long tcptestFrame::ID_BUTTON8 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL6 = wxNewId();
|
||
|
const long tcptestFrame::ID_STATICTEXT2 = wxNewId();
|
||
|
const long tcptestFrame::ID_TEXTCTRL1 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL7 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL2 = wxNewId();
|
||
|
const long tcptestFrame::ID_TEXTCTRL3 = wxNewId();
|
||
|
const long tcptestFrame::ID_CHECKBOX1 = wxNewId();
|
||
|
const long tcptestFrame::ID_SPINCTRL1 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL10 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL8 = wxNewId();
|
||
|
const long tcptestFrame::ID_BUTTON3 = wxNewId();
|
||
|
const long tcptestFrame::ID_BUTTON4 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL9 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL4 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL3 = wxNewId();
|
||
|
const long tcptestFrame::ID_STATICTEXT5 = wxNewId();
|
||
|
const long tcptestFrame::ID_TEXTCTRL7 = wxNewId();
|
||
|
const long tcptestFrame::ID_STATICTEXT6 = wxNewId();
|
||
|
const long tcptestFrame::ID_TEXTCTRL4 = wxNewId();
|
||
|
const long tcptestFrame::ID_BUTTON5 = wxNewId();
|
||
|
const long tcptestFrame::ID_BUTTON6 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL14 = wxNewId();
|
||
|
const long tcptestFrame::ID_STATICTEXT8 = wxNewId();
|
||
|
const long tcptestFrame::ID_TEXTCTRL5 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL16 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL13 = wxNewId();
|
||
|
const long tcptestFrame::ID_TEXTCTRL6 = wxNewId();
|
||
|
const long tcptestFrame::ID_CHECKBOX2 = wxNewId();
|
||
|
const long tcptestFrame::ID_SPINCTRL2 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL19 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL18 = wxNewId();
|
||
|
const long tcptestFrame::ID_BUTTON7 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL20 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL17 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL12 = wxNewId();
|
||
|
const long tcptestFrame::ID_NOTEBOOK1 = wxNewId();
|
||
|
const long tcptestFrame::ID_PANEL1 = wxNewId();
|
||
|
const long tcptestFrame::idMenuQuit = wxNewId();
|
||
|
const long tcptestFrame::idMenuAbout = wxNewId();
|
||
|
const long tcptestFrame::ID_STATUSBAR1 = wxNewId();
|
||
|
//*)
|
||
|
|
||
|
|
||
|
const long tcptestFrame::ID_TCPSERVER1 = wxNewId();
|
||
|
const long tcptestFrame::ID_TCPCLIENT1 = wxNewId();
|
||
|
|
||
|
|
||
|
BEGIN_EVENT_TABLE(tcptestFrame,wxFrame)
|
||
|
//(*EventTable(tcptestFrame)
|
||
|
//*)
|
||
|
END_EVENT_TABLE()
|
||
|
|
||
|
tcptestFrame::tcptestFrame(wxWindow* parent,wxWindowID id)
|
||
|
{
|
||
|
//(*Initialize(tcptestFrame)
|
||
|
wxBoxSizer* BoxSizer10;
|
||
|
wxBoxSizer* BoxSizer11;
|
||
|
wxBoxSizer* BoxSizer12;
|
||
|
wxBoxSizer* BoxSizer13;
|
||
|
wxBoxSizer* BoxSizer14;
|
||
|
wxBoxSizer* BoxSizer16;
|
||
|
wxBoxSizer* BoxSizer17;
|
||
|
wxBoxSizer* BoxSizer18;
|
||
|
wxBoxSizer* BoxSizer19;
|
||
|
wxBoxSizer* BoxSizer1;
|
||
|
wxBoxSizer* BoxSizer20;
|
||
|
wxBoxSizer* BoxSizer2;
|
||
|
wxBoxSizer* BoxSizer3;
|
||
|
wxBoxSizer* BoxSizer4;
|
||
|
wxBoxSizer* BoxSizer5;
|
||
|
wxBoxSizer* BoxSizer6;
|
||
|
wxBoxSizer* BoxSizer7;
|
||
|
wxBoxSizer* BoxSizer8;
|
||
|
wxBoxSizer* BoxSizer9;
|
||
|
wxMenu* Menu1;
|
||
|
wxMenu* Menu2;
|
||
|
wxMenuBar* MenuBar1;
|
||
|
wxMenuItem* MenuItem1;
|
||
|
wxMenuItem* MenuItem2;
|
||
|
|
||
|
Create(parent, wxID_ANY, _("TCP Client/Server"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE, _T("wxID_ANY"));
|
||
|
SetMinSize(wxSize(340,320));
|
||
|
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
|
||
|
// This code will set a smaller font if Win 3.11 is detected:
|
||
|
int majorVer; int minorVer;
|
||
|
wxGetOsVersion(&majorVer, &minorVer);
|
||
|
if (minorVer == 30 || majorVer == 30 || majorVer == 3)
|
||
|
{
|
||
|
wxFont thisFont(8,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_NORMAL,false,wxEmptyString,wxFONTENCODING_DEFAULT);
|
||
|
SetFont(thisFont);
|
||
|
}
|
||
|
BoxSizer1 = new wxBoxSizer(wxHORIZONTAL);
|
||
|
Panel1 = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxSize(286,334), wxTAB_TRAVERSAL, _T("ID_PANEL1"));
|
||
|
BoxSizer2 = new wxBoxSizer(wxVERTICAL);
|
||
|
Notebook1 = new wxNotebook(Panel1, ID_NOTEBOOK1, wxDefaultPosition, wxDefaultSize, 0, _T("ID_NOTEBOOK1"));
|
||
|
Panel3 = new wxPanel(Notebook1, ID_PANEL3, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL3"));
|
||
|
BoxSizer4 = new wxBoxSizer(wxVERTICAL);
|
||
|
Panel2 = new wxPanel(Panel3, ID_PANEL2, wxDefaultPosition, wxSize(330,191), wxTAB_TRAVERSAL, _T("ID_PANEL2"));
|
||
|
BoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
|
||
|
Panel5 = new wxPanel(Panel2, ID_PANEL5, wxDefaultPosition, wxDLG_UNIT(Panel2,wxSize(58,36)), wxTAB_TRAVERSAL, _T("ID_PANEL5"));
|
||
|
BoxSizer7 = new wxBoxSizer(wxVERTICAL);
|
||
|
LabelCount1 = new wxStaticText(Panel5, ID_STATICTEXT3, _("Client count: 0"), wxDefaultPosition, wxDLG_UNIT(Panel5,wxSize(56,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT3"));
|
||
|
BoxSizer7->Add(LabelCount1, 0, wxALIGN_LEFT, 0);
|
||
|
BoxSizer7->Add(20,1,0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
||
|
StaticText4 = new wxStaticText(Panel5, ID_STATICTEXT4, _("Port"), wxDefaultPosition, wxDLG_UNIT(Panel5,wxSize(38,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT4"));
|
||
|
BoxSizer7->Add(StaticText4, 0, wxALIGN_LEFT, 5);
|
||
|
PortSrvText1 = new wxTextCtrl(Panel5, ID_TEXTCTRL2, _("3000"), wxDefaultPosition, wxDLG_UNIT(Panel5,wxSize(30,-1)), wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL2"));
|
||
|
BoxSizer7->Add(PortSrvText1, 0, wxTOP|wxBOTTOM, 0);
|
||
|
BtnOpenSrv = new wxButton(Panel5, ID_BUTTON1, _("Open server"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));
|
||
|
BoxSizer7->Add(BtnOpenSrv, 0, wxTOP|wxEXPAND, 8);
|
||
|
BtnCloseSrv = new wxButton(Panel5, ID_BUTTON2, _("Close server"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2"));
|
||
|
BoxSizer7->Add(BtnCloseSrv, 0, wxTOP|wxBOTTOM|wxEXPAND, 4);
|
||
|
Panel5->SetSizer(BoxSizer7);
|
||
|
BoxSizer3->Add(Panel5, 0, wxALL|wxEXPAND, 5);
|
||
|
Panel6 = new wxPanel(Panel2, ID_PANEL6, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL6"));
|
||
|
BoxSizer5 = new wxBoxSizer(wxVERTICAL);
|
||
|
StaticText1 = new wxStaticText(Panel6, ID_STATICTEXT1, _("Client list"), wxDefaultPosition, wxDLG_UNIT(Panel6,wxSize(45,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT1"));
|
||
|
BoxSizer5->Add(StaticText1, 0, wxALL|wxALIGN_LEFT, 5);
|
||
|
ListBox1 = new wxListBox(Panel6, ID_LISTBOX1, wxDefaultPosition, wxDefaultSize, 0, 0, wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_LISTBOX1"));
|
||
|
BoxSizer5->Add(ListBox1, 1, wxALL|wxEXPAND, 5);
|
||
|
BtnDropClient = new wxButton(Panel6, ID_BUTTON8, _("Drop client"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON8"));
|
||
|
BoxSizer5->Add(BtnDropClient, 0, wxALL|wxALIGN_LEFT, 4);
|
||
|
Panel6->SetSizer(BoxSizer5);
|
||
|
BoxSizer3->Add(Panel6, 1, wxALL|wxEXPAND, 0);
|
||
|
Panel7 = new wxPanel(Panel2, ID_PANEL7, wxDefaultPosition, wxSize(360,172), wxTAB_TRAVERSAL, _T("ID_PANEL7"));
|
||
|
BoxSizer6 = new wxBoxSizer(wxVERTICAL);
|
||
|
StaticText2 = new wxStaticText(Panel7, ID_STATICTEXT2, _("Log"), wxDefaultPosition, wxDLG_UNIT(Panel7,wxSize(61,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT2"));
|
||
|
BoxSizer6->Add(StaticText2, 0, wxALL|wxALIGN_LEFT, 5);
|
||
|
LogSrv1 = new wxTextCtrl(Panel7, ID_TEXTCTRL1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL1"));
|
||
|
BoxSizer6->Add(LogSrv1, 1, wxALL|wxEXPAND, 5);
|
||
|
Panel7->SetSizer(BoxSizer6);
|
||
|
BoxSizer3->Add(Panel7, 2, wxALL|wxEXPAND, 0);
|
||
|
Panel2->SetSizer(BoxSizer3);
|
||
|
BoxSizer4->Add(Panel2, 1, wxALL|wxEXPAND, 5);
|
||
|
Panel4 = new wxPanel(Panel3, ID_PANEL4, wxDefaultPosition, wxSize(646,79), wxTAB_TRAVERSAL, _T("ID_PANEL4"));
|
||
|
BoxSizer8 = new wxBoxSizer(wxHORIZONTAL);
|
||
|
Panel8 = new wxPanel(Panel4, ID_PANEL8, wxDefaultPosition, wxDLG_UNIT(Panel4,wxSize(68,26)), wxTAB_TRAVERSAL, _T("ID_PANEL8"));
|
||
|
BoxSizer9 = new wxBoxSizer(wxVERTICAL);
|
||
|
TextSendSrv1 = new wxTextCtrl(Panel8, ID_TEXTCTRL3, _("Message"), wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL3"));
|
||
|
BoxSizer9->Add(TextSendSrv1, 0, wxEXPAND, 0);
|
||
|
Panel10 = new wxPanel(Panel8, ID_PANEL10, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL10"));
|
||
|
BoxSizer10 = new wxBoxSizer(wxHORIZONTAL);
|
||
|
CheckBinarySrv = new wxCheckBox(Panel10, ID_CHECKBOX1, _("Binary mode (send a number)"), wxDefaultPosition, wxDLG_UNIT(Panel10,wxSize(119,8)), 0, wxDefaultValidator, _T("ID_CHECKBOX1"));
|
||
|
CheckBinarySrv->SetValue(false);
|
||
|
BoxSizer10->Add(CheckBinarySrv, 1, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
||
|
SpinCtrlSrv1 = new wxSpinCtrl(Panel10, ID_SPINCTRL1, _T("12345"), wxDefaultPosition, wxDLG_UNIT(Panel10,wxSize(80,-1)), wxBORDER_SIMPLE, -32737, 32737, 12345, _T("ID_SPINCTRL1"));
|
||
|
SpinCtrlSrv1->SetValue(_T("12345"));
|
||
|
SpinCtrlSrv1->Disable();
|
||
|
BoxSizer10->Add(SpinCtrlSrv1, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5);
|
||
|
Panel10->SetSizer(BoxSizer10);
|
||
|
BoxSizer9->Add(Panel10, 1, wxALL|wxEXPAND, 0);
|
||
|
Panel8->SetSizer(BoxSizer9);
|
||
|
BoxSizer8->Add(Panel8, 1, wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND, 4);
|
||
|
Panel9 = new wxPanel(Panel4, ID_PANEL9, wxDefaultPosition, wxSize(139,95), wxTAB_TRAVERSAL, _T("ID_PANEL9"));
|
||
|
BoxSizer11 = new wxBoxSizer(wxVERTICAL);
|
||
|
BtnSrvSendAll = new wxButton(Panel9, ID_BUTTON3, _("Send to all"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON3"));
|
||
|
BtnSrvSendAll->SetMinSize(wxDLG_UNIT(Panel9,wxSize(48,13)));
|
||
|
BoxSizer11->Add(BtnSrvSendAll, 0, wxEXPAND, 0);
|
||
|
BtnSrvSendSel = new wxButton(Panel9, ID_BUTTON4, _("Send to sel"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON4"));
|
||
|
BtnSrvSendSel->SetMinSize(wxDLG_UNIT(Panel9,wxSize(48,13)));
|
||
|
BoxSizer11->Add(BtnSrvSendSel, 0, wxTOP|wxEXPAND, 4);
|
||
|
Panel9->SetSizer(BoxSizer11);
|
||
|
BoxSizer8->Add(Panel9, 0, wxLEFT|wxEXPAND, 2);
|
||
|
Panel4->SetSizer(BoxSizer8);
|
||
|
BoxSizer4->Add(Panel4, 0, wxALL|wxEXPAND, 5);
|
||
|
Panel3->SetSizer(BoxSizer4);
|
||
|
Panel12 = new wxPanel(Notebook1, ID_PANEL12, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL12"));
|
||
|
BoxSizer12 = new wxBoxSizer(wxVERTICAL);
|
||
|
Panel13 = new wxPanel(Panel12, ID_PANEL13, wxDefaultPosition, wxSize(330,191), wxTAB_TRAVERSAL, _T("ID_PANEL13"));
|
||
|
BoxSizer13 = new wxBoxSizer(wxHORIZONTAL);
|
||
|
Panel14 = new wxPanel(Panel13, ID_PANEL14, wxDefaultPosition, wxDLG_UNIT(Panel13,wxSize(58,36)), wxTAB_TRAVERSAL, _T("ID_PANEL14"));
|
||
|
BoxSizer14 = new wxBoxSizer(wxVERTICAL);
|
||
|
StaticText3 = new wxStaticText(Panel14, ID_STATICTEXT5, _("Address"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(56,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT5"));
|
||
|
BoxSizer14->Add(StaticText3, 0, wxBOTTOM|wxALIGN_LEFT, 5);
|
||
|
TextClientHost1 = new wxTextCtrl(Panel14, ID_TEXTCTRL7, _("127.0.0.1"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(30,-1)), wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL7"));
|
||
|
BoxSizer14->Add(TextClientHost1, 0, wxTOP|wxBOTTOM|wxEXPAND, 0);
|
||
|
StaticText5 = new wxStaticText(Panel14, ID_STATICTEXT6, _("Port"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(38,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT6"));
|
||
|
BoxSizer14->Add(StaticText5, 0, wxALIGN_LEFT, 5);
|
||
|
TextClientPort1 = new wxTextCtrl(Panel14, ID_TEXTCTRL4, _("3000"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(30,-1)), wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL4"));
|
||
|
BoxSizer14->Add(TextClientPort1, 0, wxTOP|wxBOTTOM, 0);
|
||
|
BtnClientConn = new wxButton(Panel14, ID_BUTTON5, _("Connect"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON5"));
|
||
|
BoxSizer14->Add(BtnClientConn, 0, wxTOP|wxEXPAND, 8);
|
||
|
BtnClientDisconn = new wxButton(Panel14, ID_BUTTON6, _("Disconnect"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON6"));
|
||
|
BoxSizer14->Add(BtnClientDisconn, 0, wxTOP|wxBOTTOM|wxEXPAND, 4);
|
||
|
Panel14->SetSizer(BoxSizer14);
|
||
|
BoxSizer13->Add(Panel14, 0, wxALL|wxEXPAND, 5);
|
||
|
Panel16 = new wxPanel(Panel13, ID_PANEL16, wxDefaultPosition, wxSize(360,172), wxTAB_TRAVERSAL, _T("ID_PANEL16"));
|
||
|
BoxSizer16 = new wxBoxSizer(wxVERTICAL);
|
||
|
StaticText7 = new wxStaticText(Panel16, ID_STATICTEXT8, _("Log"), wxDefaultPosition, wxDLG_UNIT(Panel16,wxSize(61,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT8"));
|
||
|
BoxSizer16->Add(StaticText7, 0, wxALL|wxALIGN_LEFT, 5);
|
||
|
LogClient1 = new wxTextCtrl(Panel16, ID_TEXTCTRL5, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL5"));
|
||
|
BoxSizer16->Add(LogClient1, 1, wxALL|wxEXPAND, 5);
|
||
|
Panel16->SetSizer(BoxSizer16);
|
||
|
BoxSizer13->Add(Panel16, 2, wxALL|wxEXPAND, 0);
|
||
|
Panel13->SetSizer(BoxSizer13);
|
||
|
BoxSizer12->Add(Panel13, 1, wxALL|wxEXPAND, 5);
|
||
|
Panel17 = new wxPanel(Panel12, ID_PANEL17, wxDefaultPosition, wxSize(646,79), wxTAB_TRAVERSAL, _T("ID_PANEL17"));
|
||
|
BoxSizer17 = new wxBoxSizer(wxHORIZONTAL);
|
||
|
Panel18 = new wxPanel(Panel17, ID_PANEL18, wxDefaultPosition, wxDLG_UNIT(Panel17,wxSize(68,26)), wxTAB_TRAVERSAL, _T("ID_PANEL18"));
|
||
|
BoxSizer18 = new wxBoxSizer(wxVERTICAL);
|
||
|
TextSendClient1 = new wxTextCtrl(Panel18, ID_TEXTCTRL6, _("Message"), wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL6"));
|
||
|
BoxSizer18->Add(TextSendClient1, 0, wxEXPAND, 0);
|
||
|
Panel19 = new wxPanel(Panel18, ID_PANEL19, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL19"));
|
||
|
BoxSizer19 = new wxBoxSizer(wxHORIZONTAL);
|
||
|
CheckBinaryClient = new wxCheckBox(Panel19, ID_CHECKBOX2, _("Binary mode (send a number)"), wxDefaultPosition, wxDLG_UNIT(Panel19,wxSize(119,8)), 0, wxDefaultValidator, _T("ID_CHECKBOX2"));
|
||
|
CheckBinaryClient->SetValue(false);
|
||
|
BoxSizer19->Add(CheckBinaryClient, 1, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
||
|
SpinCtrlClient1 = new wxSpinCtrl(Panel19, ID_SPINCTRL2, _T("12345"), wxDefaultPosition, wxDLG_UNIT(Panel19,wxSize(80,-1)), wxBORDER_SIMPLE, -32737, 32737, 12345, _T("ID_SPINCTRL2"));
|
||
|
SpinCtrlClient1->SetValue(_T("12345"));
|
||
|
SpinCtrlClient1->Disable();
|
||
|
BoxSizer19->Add(SpinCtrlClient1, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5);
|
||
|
Panel19->SetSizer(BoxSizer19);
|
||
|
BoxSizer18->Add(Panel19, 1, wxALL|wxEXPAND, 0);
|
||
|
Panel18->SetSizer(BoxSizer18);
|
||
|
BoxSizer17->Add(Panel18, 1, wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND, 4);
|
||
|
Panel20 = new wxPanel(Panel17, ID_PANEL20, wxDefaultPosition, wxSize(139,95), wxTAB_TRAVERSAL, _T("ID_PANEL20"));
|
||
|
BoxSizer20 = new wxBoxSizer(wxVERTICAL);
|
||
|
BtnClientSend = new wxButton(Panel20, ID_BUTTON7, _("Send"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON7"));
|
||
|
BtnClientSend->SetMinSize(wxDLG_UNIT(Panel20,wxSize(48,13)));
|
||
|
BoxSizer20->Add(BtnClientSend, 0, wxEXPAND, 0);
|
||
|
Panel20->SetSizer(BoxSizer20);
|
||
|
BoxSizer17->Add(Panel20, 0, wxLEFT|wxEXPAND, 2);
|
||
|
Panel17->SetSizer(BoxSizer17);
|
||
|
BoxSizer12->Add(Panel17, 0, wxALL|wxEXPAND, 5);
|
||
|
Panel12->SetSizer(BoxSizer12);
|
||
|
Notebook1->AddPage(Panel3, _("Server"), false);
|
||
|
Notebook1->AddPage(Panel12, _("Client"), false);
|
||
|
BoxSizer2->Add(Notebook1, 1, wxALL|wxEXPAND, 5);
|
||
|
Panel1->SetSizer(BoxSizer2);
|
||
|
BoxSizer1->Add(Panel1, 1, wxALL|wxEXPAND, 0);
|
||
|
SetSizer(BoxSizer1);
|
||
|
MenuBar1 = new wxMenuBar();
|
||
|
Menu1 = new wxMenu();
|
||
|
MenuItem1 = new wxMenuItem(Menu1, idMenuQuit, _("Quit\tAlt-F4"), _("Quit the application"), wxITEM_NORMAL);
|
||
|
Menu1->Append(MenuItem1);
|
||
|
MenuBar1->Append(Menu1, _("&File"));
|
||
|
Menu2 = new wxMenu();
|
||
|
MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), _("Show info about this application"), wxITEM_NORMAL);
|
||
|
Menu2->Append(MenuItem2);
|
||
|
MenuBar1->Append(Menu2, _("Help"));
|
||
|
SetMenuBar(MenuBar1);
|
||
|
StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1, 0, _T("ID_STATUSBAR1"));
|
||
|
int __wxStatusBarWidths_1[1] = { -1 };
|
||
|
int __wxStatusBarStyles_1[1] = { wxSB_NORMAL };
|
||
|
StatusBar1->SetFieldsCount(1,__wxStatusBarWidths_1);
|
||
|
StatusBar1->SetStatusStyles(1,__wxStatusBarStyles_1);
|
||
|
SetStatusBar(StatusBar1);
|
||
|
Fit();
|
||
|
|
||
|
Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnOpenSrvClick1);
|
||
|
Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnCloseSrvClick);
|
||
|
Connect(ID_BUTTON8,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnDropClientClick);
|
||
|
Connect(ID_CHECKBOX1,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnCheckBinarySrvClick);
|
||
|
Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnSrvSendAllClick);
|
||
|
Connect(ID_BUTTON4,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnSrvSendSelClick);
|
||
|
Connect(ID_BUTTON5,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnClientConnClick);
|
||
|
Connect(ID_BUTTON6,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnClientDisconnClick);
|
||
|
Connect(ID_CHECKBOX2,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnCheckBinaryClientClick);
|
||
|
Connect(ID_BUTTON7,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnClientSendClick);
|
||
|
Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&tcptestFrame::OnQuit);
|
||
|
Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&tcptestFrame::OnAbout);
|
||
|
//*)
|
||
|
|
||
|
TCPServer1 = new SimpleTCPServer(this, ID_TCPSERVER1);
|
||
|
Connect(ID_TCPSERVER1, EV_CLIENTCONNECTED,(wxObjectEventFunction)&tcptestFrame::TCPServer1OnConnected);
|
||
|
Connect(ID_TCPSERVER1, EV_CLIENTDISCONNECTED,(wxObjectEventFunction)&tcptestFrame::TCPServer1OnDisconnected);
|
||
|
Connect(ID_TCPSERVER1, EV_ONDATA,(wxObjectEventFunction)&tcptestFrame::TCPServer1OnData);
|
||
|
|
||
|
|
||
|
TCPClient1 = new SimpleTCPClient(this, ID_TCPCLIENT1);
|
||
|
Connect(ID_TCPCLIENT1, EV_CLIENTONDATA,(wxObjectEventFunction)&tcptestFrame::TCPClient1OnData);
|
||
|
|
||
|
}
|
||
|
|
||
|
// Old habits...
|
||
|
wxString IntToStr( int num_in )
|
||
|
{
|
||
|
wxString str_out = wxString::Format(wxT("%i"),num_in);
|
||
|
return str_out;
|
||
|
}
|
||
|
int StrToInt( wxString str_in )
|
||
|
{
|
||
|
int int_out = wxAtoi(str_in);
|
||
|
return int_out;
|
||
|
}
|
||
|
void tcptestFrame::LogServer( wxString logText )
|
||
|
{
|
||
|
// Prints log to a text control
|
||
|
// "(GUI)" is prepended to make it easier to understand how the application works
|
||
|
// It will show which part of log was generated here
|
||
|
LogSrv1->WriteText("(GUI) " + logText + "\n");
|
||
|
}
|
||
|
void tcptestFrame::LogClient( wxString logText )
|
||
|
{
|
||
|
// Prints log to a text control
|
||
|
// "(GUI)" is prepended to make it easier to understand how the application works
|
||
|
// It will show which part of log was generated here
|
||
|
LogClient1->WriteText("(GUI) " + logText + "\n");
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::TCPClient1OnData(wxCommandEvent& event)
|
||
|
{
|
||
|
|
||
|
// This will turn true if we find non-string data
|
||
|
bool binaryData = false;
|
||
|
|
||
|
LogClient("Incoming data:");
|
||
|
|
||
|
// Peek single byte (peeking doesn't clear data that was read)
|
||
|
unsigned char peekBuf[1];
|
||
|
TCPClient1->Peek(peekBuf, 1);
|
||
|
|
||
|
// If data starts with 0x00 or 0x01 we assume that it is binary data
|
||
|
// This is just an example and not a standard of any kind
|
||
|
if (peekBuf[0] == 0x00 || peekBuf[0] == 0x01) binaryData = true;
|
||
|
|
||
|
|
||
|
// If this is not binary data, just read it as text string and print to log
|
||
|
if ( !binaryData )
|
||
|
{
|
||
|
LogClient( TCPClient1->ReadStr() );
|
||
|
}
|
||
|
else if ( binaryData ) // If it is binary data, then proceed with it
|
||
|
{
|
||
|
LogClient("Found binary data");
|
||
|
|
||
|
// Prepare 8-byte data buffer to receive data
|
||
|
// because currently we are only handling 8-byte data packets
|
||
|
|
||
|
unsigned char recvBuf[8];
|
||
|
memset(recvBuf, 0, 8); // Fill with zeros
|
||
|
|
||
|
// Read 8 bytes to buffer
|
||
|
TCPClient1->Read(recvBuf, 8);
|
||
|
|
||
|
// Check if data contains header and termination that we can understand
|
||
|
// Currently we are only expecting data in this format:
|
||
|
// 0x01 0x49 0x04 X X X X 0x04
|
||
|
// where X X X X are 4 bytes of 32-bit integer number
|
||
|
//
|
||
|
if (recvBuf[0] == 0x01 && recvBuf[1] == 0x49 && recvBuf[2] == 0x04 && recvBuf[7] == 0x04)
|
||
|
{
|
||
|
// Resulting number will be stored here
|
||
|
long integerValue = 0;
|
||
|
|
||
|
// Read 4 bytes of data into 32-bit integer
|
||
|
// i<4 means 4 bytes, recvBuf[3+i] means we start reading from 3rd byte of buffer
|
||
|
for (int i=0; i<4; i++) integerValue |= (recvBuf[3+i] << i*8);
|
||
|
|
||
|
// Print received integer value in log
|
||
|
LogClient("Received 32-bit integer value:\n"
|
||
|
+ wxString::Format(wxT("%i"),integerValue) );
|
||
|
|
||
|
}
|
||
|
else LogClient("Unknown format of data"); // Warn about unrecognized data if it didn't met specified conditions
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::TCPServer1OnConnected(wxCommandEvent& event)
|
||
|
{
|
||
|
LogServer("Client connected");
|
||
|
UpdateGUI();
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::TCPServer1OnDisconnected(wxCommandEvent& event)
|
||
|
{
|
||
|
LogServer("Client disconnected");
|
||
|
UpdateGUI();
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::TCPServer1OnData(wxCommandEvent& event)
|
||
|
{
|
||
|
|
||
|
wxSocketBase *sock = (wxSocketBase*) event.GetClientData();
|
||
|
wxIPV4address addr;
|
||
|
sock->GetPeer(addr);
|
||
|
|
||
|
//LogServer( "Data from " + addr.IPAddress() + ":\n"
|
||
|
// + TCPServer1->ReadStr( sock ) );
|
||
|
|
||
|
|
||
|
// This will turn true if we find non-string data
|
||
|
bool binaryData = false;
|
||
|
|
||
|
LogServer( "Data from " + addr.IPAddress() + "\n" );
|
||
|
|
||
|
// Peek single byte (peeking doesn't clear data that was read)
|
||
|
unsigned char peekBuf[1];
|
||
|
TCPServer1->Peek(peekBuf, 1, sock);
|
||
|
|
||
|
// If data starts with 0x00 or 0x01 we assume that it is binary data
|
||
|
// This is just an example and not a standard of any kind
|
||
|
if (peekBuf[0] == 0x00 || peekBuf[0] == 0x01) binaryData = true;
|
||
|
|
||
|
|
||
|
// If this is not binary data, just read it as text string and print to log
|
||
|
if ( !binaryData )
|
||
|
{
|
||
|
LogServer( TCPServer1->ReadStr(sock) );
|
||
|
}
|
||
|
else if ( binaryData ) // If it is binary data, then proceed with it
|
||
|
{
|
||
|
LogServer("Found binary data");
|
||
|
|
||
|
// Prepare 8-byte data buffer to receive data
|
||
|
// because currently we are only handling 8-byte data packets
|
||
|
|
||
|
unsigned char recvBuf[8];
|
||
|
memset(recvBuf, 0, 8); // Fill with zeros
|
||
|
|
||
|
// Read 8 bytes to buffer
|
||
|
TCPServer1->Read(recvBuf, 8, sock);
|
||
|
|
||
|
// Check if data contains header and termination that we can understand
|
||
|
// Currently we are only expecting data in this format:
|
||
|
// 0x01 0x49 0x04 X X X X 0x04
|
||
|
// where X X X X are 4 bytes of 32-bit integer number
|
||
|
//
|
||
|
if (recvBuf[0] == 0x01 && recvBuf[1] == 0x49 && recvBuf[2] == 0x04 && recvBuf[7] == 0x04)
|
||
|
{
|
||
|
// Resulting number will be stored here
|
||
|
long integerValue = 0;
|
||
|
|
||
|
// Read 4 bytes of data into 32-bit integer
|
||
|
// i<4 means 4 bytes, recvBuf[3+i] means we start reading from 3rd byte of buffer
|
||
|
for (int i=0; i<4; i++) integerValue |= (recvBuf[3+i] << i*8);
|
||
|
|
||
|
// Print received integer value in log
|
||
|
LogServer("Received 32-bit integer value:\n"
|
||
|
+ wxString::Format(wxT("%i"),integerValue) );
|
||
|
|
||
|
}
|
||
|
else LogServer("Unknown format of data"); // Warn about unrecognized data if it didn't met specified conditions
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
tcptestFrame::~tcptestFrame()
|
||
|
{
|
||
|
//(*Destroy(tcptestFrame)
|
||
|
//*)
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnQuit(wxCommandEvent& event)
|
||
|
{
|
||
|
Close();
|
||
|
}
|
||
|
|
||
|
|
||
|
void tcptestFrame::UpdateGUI()
|
||
|
{
|
||
|
|
||
|
if (TCPServer1) // Update IP list and client count with current server data
|
||
|
{
|
||
|
// Display client count
|
||
|
LabelCount1->SetLabel( "Client count: " + IntToStr( TCPServer1->clientCount() ) );
|
||
|
|
||
|
// Get target address from selected IP list field
|
||
|
int lastIndex = ListBox1->GetSelection();
|
||
|
wxString lastSelection = "";
|
||
|
if (lastIndex >= 0) lastSelection = ListBox1->GetString(lastIndex);
|
||
|
|
||
|
ListBox1->Clear(); // Temporarily clear list of clients
|
||
|
|
||
|
// Iterate over map of connected clients and update list
|
||
|
for( std::map<wxSocketBase*, wxString>::const_iterator it = TCPServer1->clientMap.begin();
|
||
|
it != TCPServer1->clientMap.end(); ++it)
|
||
|
{
|
||
|
ListBox1->Append( it->second );
|
||
|
}
|
||
|
|
||
|
// Bring back the last selection
|
||
|
if (lastIndex >= 0) ListBox1->SetStringSelection(lastSelection);
|
||
|
|
||
|
}
|
||
|
else // Clear everything if server is not active
|
||
|
{
|
||
|
ListBox1->Clear();
|
||
|
LabelCount1->SetLabel( "Client count: 0" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void tcptestFrame::OnAbout(wxCommandEvent& event)
|
||
|
{
|
||
|
wxString msg = "TCP test built with \n" + wxbuildinfo(long_f);
|
||
|
wxMessageBox(msg, _("About"));
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnBtnOpenSrvClick(wxCommandEvent& event)
|
||
|
{
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnBtnSrvSendSelClick(wxCommandEvent& event)
|
||
|
{
|
||
|
|
||
|
// If no binary mode checked, just send text string
|
||
|
if (!CheckBinarySrv->GetValue())
|
||
|
{
|
||
|
// Get target address from selected IP list field
|
||
|
int selectedAddrIndex = ListBox1->GetSelection();
|
||
|
|
||
|
// Proceed only if selection index is 0 or greater (-1 would mean no selection)
|
||
|
if (selectedAddrIndex >= 0)
|
||
|
{
|
||
|
wxString targetAddr = ListBox1->GetString(selectedAddrIndex);
|
||
|
// Send to target address
|
||
|
TCPServer1->WriteStr(TextSendSrv1->GetValue(), targetAddr );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Prepare 8-byte data buffer
|
||
|
unsigned char sendBuf[8];
|
||
|
memset(sendBuf, 0, 8); // Fill with zeros
|
||
|
|
||
|
// Get a number that we want to send as binary data
|
||
|
// It will be stored in 32-bit integer, that means 4 bytes of data
|
||
|
long integerValue = SpinCtrlSrv1->GetValue();
|
||
|
|
||
|
// Create a header in first three bytes (we are counting bytes from zero)
|
||
|
// this is just an example and not some standard format, client application needs to recognize our format
|
||
|
sendBuf[0] = 0x01; // Receiver will read this as beginning of binary packet
|
||
|
sendBuf[1] = 0x49; // This is hex code of "I" letter, that will mean signed integer
|
||
|
sendBuf[2] = 0x04; // 0x04 will mean we are sending 4 bytes of 32-bit integer
|
||
|
|
||
|
// Put 32-bit integer into buffer
|
||
|
// 3 in sendBuf[3+i] means that value will be placed starting with 3rd byte of buffer
|
||
|
// i<4 means that we are writing 4 bytes
|
||
|
for (int i=0; i<4; i++) sendBuf[3+i] = (integerValue >> i*8) & 0xFF;
|
||
|
|
||
|
sendBuf[7] = 0x04; // Set last byte to 0x04 as a footer (this is just an arbitrary choice)
|
||
|
|
||
|
// Get target address from selected IP list field
|
||
|
int selectedAddrIndex = ListBox1->GetSelection();
|
||
|
|
||
|
// Proceed only if selection index is 0 or greater (-1 would mean no selection)
|
||
|
if (selectedAddrIndex >= 0)
|
||
|
{
|
||
|
wxString targetAddr = ListBox1->GetString(selectedAddrIndex);
|
||
|
// Send to target address
|
||
|
TCPServer1->Write(sendBuf, 8, targetAddr );
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
// Note: because we are sending binary data, it also needs to be read as such.
|
||
|
// Reading it as text would result in empty string or random characters.
|
||
|
// Receiver should read first bytes of our header, recognize format of the data
|
||
|
// and process it properly (this is done in client receiving example).
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnBtnOpenSrvClick1(wxCommandEvent& event)
|
||
|
{
|
||
|
TCPServer1->logBox = LogSrv1;
|
||
|
TCPServer1->Port( wxAtoi( PortSrvText1->GetValue() ) );
|
||
|
TCPServer1->Open();
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnBtnCloseSrvClick(wxCommandEvent& event)
|
||
|
{
|
||
|
TCPServer1->Close();
|
||
|
UpdateGUI();
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnBtnClientConnClick(wxCommandEvent& event)
|
||
|
{
|
||
|
TCPClient1->logBox = LogClient1;
|
||
|
TCPClient1->Connect( TextClientHost1->GetValue(), wxAtoi( TextClientPort1->GetValue() ) );
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnBtnClientDisconnClick(wxCommandEvent& event)
|
||
|
{
|
||
|
TCPClient1->Disconnect();
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnBtnClientSendClick(wxCommandEvent& event)
|
||
|
{
|
||
|
|
||
|
if (!CheckBinaryClient->GetValue())
|
||
|
{
|
||
|
TCPClient1->WriteStr( TextSendClient1->GetValue() );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Prepare 8-byte data buffer
|
||
|
unsigned char sendBuf[8];
|
||
|
memset(sendBuf, 0, 8); // Fill with zeros
|
||
|
|
||
|
// Get a number that we want to send as binary data
|
||
|
// It will be stored in 32-bit integer, that means 4 bytes of data
|
||
|
long integerValue = SpinCtrlClient1->GetValue();
|
||
|
|
||
|
// Create a header in first three bytes (we are counting bytes from zero)
|
||
|
// this is just an example and not some standard format, client application needs to recognize our format
|
||
|
sendBuf[0] = 0x01; // Receiver will read this as beginning of binary packet
|
||
|
sendBuf[1] = 0x49; // This is hex code of "I" letter, that will mean signed integer
|
||
|
sendBuf[2] = 0x04; // 0x04 will mean we are sending 4 bytes of 32-bit integer
|
||
|
|
||
|
// Put 32-bit integer into buffer
|
||
|
// 3 in sendBuf[3+i] means that value will be placed starting with 3rd byte of buffer
|
||
|
// i<4 means that we are writing 4 bytes
|
||
|
for (int i=0; i<4; i++) sendBuf[3+i] = (integerValue >> i*8) & 0xFF;
|
||
|
|
||
|
sendBuf[7] = 0x04; // Set last byte to 0x04 as a footer (this is just an arbitrary choice)
|
||
|
|
||
|
TCPClient1->Write(sendBuf, 8);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void tcptestFrame::OnBtnSrvSendAllClick(wxCommandEvent& event)
|
||
|
{
|
||
|
// If no binary mode checked, just send text string
|
||
|
if (!CheckBinarySrv->GetValue())
|
||
|
{
|
||
|
TCPServer1->WriteStr(TextSendSrv1->GetValue());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Prepare 8-byte data buffer
|
||
|
unsigned char sendBuf[8];
|
||
|
memset(sendBuf, 0, 8); // Fill with zeros
|
||
|
|
||
|
// Get a number that we want to send as binary data
|
||
|
// It will be stored in 32-bit integer, that means 4 bytes of data
|
||
|
long integerValue = SpinCtrlSrv1->GetValue();
|
||
|
|
||
|
// Create a header in first three bytes (we are counting bytes from zero)
|
||
|
// this is just an example and not some standard format, client application needs to recognize our format
|
||
|
sendBuf[0] = 0x01; // Receiver will read this as beginning of binary packet
|
||
|
sendBuf[1] = 0x49; // This is hex code of "I" letter, that will mean signed integer
|
||
|
sendBuf[2] = 0x04; // 0x04 will mean we are sending 4 bytes of 32-bit integer
|
||
|
|
||
|
// Put 32-bit integer into buffer
|
||
|
// 3 in sendBuf[3+i] means that value will be placed starting with 3rd byte of buffer
|
||
|
// i<4 means that we are writing 4 bytes
|
||
|
for (int i=0; i<4; i++) sendBuf[3+i] = (integerValue >> i*8) & 0xFF;
|
||
|
|
||
|
sendBuf[7] = 0x04; // Set last byte to 0x04 as a footer (this is just an arbitrary choice)
|
||
|
|
||
|
// Iterate over list of all clients and send data
|
||
|
for (int i=0; i< ListBox1->GetCount(); i++)
|
||
|
{
|
||
|
wxString targetAddr = ListBox1->GetString(i);
|
||
|
TCPServer1->Write(sendBuf, 8, targetAddr );
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
// Note: because we are sending binary data, it also needs to be read as such.
|
||
|
// Reading it as text would result in empty string or random characters.
|
||
|
// Receiver should read first bytes of our header, recognize format of the data
|
||
|
// and process it properly (this is done in client receiving example).
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnCheckBinarySrvClick(wxCommandEvent& event)
|
||
|
{
|
||
|
if (CheckBinarySrv->GetValue())
|
||
|
{
|
||
|
SpinCtrlSrv1->Enable();
|
||
|
TextSendSrv1->Disable();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SpinCtrlSrv1->Disable();
|
||
|
TextSendSrv1->Enable();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnBtnDropClientClick(wxCommandEvent& event)
|
||
|
{
|
||
|
// Get target address from selected IP list field
|
||
|
int selectedAddrIndex = ListBox1->GetSelection();
|
||
|
|
||
|
// Proceed only if selection index is 0 or greater (-1 would mean no selection)
|
||
|
if (selectedAddrIndex >= 0)
|
||
|
{
|
||
|
wxString targetAddr = ListBox1->GetString(selectedAddrIndex);
|
||
|
// Send to target address
|
||
|
TCPServer1->DropClient(targetAddr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void tcptestFrame::OnCheckBinaryClientClick(wxCommandEvent& event)
|
||
|
{
|
||
|
if (CheckBinaryClient->GetValue())
|
||
|
{
|
||
|
SpinCtrlClient1->Enable();
|
||
|
TextSendClient1->Disable();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SpinCtrlClient1->Disable();
|
||
|
TextSendClient1->Enable();
|
||
|
}
|
||
|
}
|