X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b62ca03d6f409732ca63c68a79b7ae81444222e5..02b51ae521db06ef12a3c2a37a5378a9f715e707:/samples/sockets/server.cpp?ds=inline diff --git a/samples/sockets/server.cpp b/samples/sockets/server.cpp index b90dc2643c..b7063e93d0 100644 --- a/samples/sockets/server.cpp +++ b/samples/sockets/server.cpp @@ -17,11 +17,6 @@ // headers // -------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(__APPLE__) -# pragma implementation "server.cpp" -# pragma interface "server.cpp" -#endif - // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -41,9 +36,7 @@ // -------------------------------------------------------------------------- // the application icon -#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) -# include "mondrian.xpm" -#endif +#include "mondrian.xpm" // -------------------------------------------------------------------------- // classes @@ -88,6 +81,24 @@ private: DECLARE_EVENT_TABLE() }; +// simple helper class to log start and end of each test +class TestLogger +{ +public: + TestLogger(const wxString& name) : m_name(name) + { + wxLogMessage("=== %s begins ===", m_name); + } + + ~TestLogger() + { + wxLogMessage("=== %s ends ===", m_name); + } + +private: + const wxString m_name; +}; + // -------------------------------------------------------------------------- // constants // -------------------------------------------------------------------------- @@ -96,11 +107,11 @@ private: enum { // menu items - SERVER_QUIT = 1000, - SERVER_ABOUT, + SERVER_QUIT = wxID_EXIT, + SERVER_ABOUT = wxID_ABOUT, // id for sockets - SERVER_ID, + SERVER_ID = 100, SOCKET_ID }; @@ -128,6 +139,9 @@ IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + // Create the main application window MyFrame *frame = new MyFrame(); @@ -163,17 +177,24 @@ MyFrame::MyFrame() : wxFrame((wxFrame *)NULL, wxID_ANY, m_menuBar->Append(m_menuFile, _("&File")); SetMenuBar(m_menuBar); +#if wxUSE_STATUSBAR // Status bar CreateStatusBar(2); +#endif // wxUSE_STATUSBAR // Make a textctrl for logging m_text = new wxTextCtrl(this, wxID_ANY, _("Welcome to wxSocket demo: Server\n"), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY); + delete wxLog::SetActiveTarget(new wxLogTextCtrl(m_text)); // Create the address - defaults to localhost:0 initially +#if wxUSE_IPV6 + wxIPV6address addr; +#else wxIPV4address addr; +#endif addr.Service(3000); // Create the socket @@ -182,12 +203,12 @@ MyFrame::MyFrame() : wxFrame((wxFrame *)NULL, wxID_ANY, // We use Ok() here to see if the server is really listening if (! m_server->Ok()) { - m_text->AppendText(_("Could not listen at the specified port !\n\n")); + wxLogMessage("Could not listen at the specified port !"); return; } else { - m_text->AppendText(_("Server listening.\n\n")); + wxLogMessage("Server listening."); } // Setup the event handler and subscribe to connection events @@ -223,10 +244,7 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) void MyFrame::Test1(wxSocketBase *sock) { - unsigned char len; - char *buf; - - m_text->AppendText(_("Test 1 begins\n")); + TestLogger logtest("Test 1"); // Receive data from socket and send it back. We will first // get a byte with the buffer size, so we can specify the @@ -237,54 +255,45 @@ void MyFrame::Test1(wxSocketBase *sock) sock->SetFlags(wxSOCKET_WAITALL); // Read the size + unsigned char len; sock->Read(&len, 1); - buf = new char[len]; + wxCharBuffer buf(len); // Read the data - sock->Read(buf, len); - m_text->AppendText(_("Got the data, sending it back\n")); + sock->Read(buf.data(), len); + wxLogMessage("Got the data, sending it back"); // Write it back sock->Write(buf, len); - delete[] buf; - - m_text->AppendText(_("Test 1 ends\n\n")); } void MyFrame::Test2(wxSocketBase *sock) { -#define MAX_MSG_SIZE 10000 + char buf[4096]; - wxString s; - wxChar *buf = new wxChar[MAX_MSG_SIZE]; - wxUint32 len; - - m_text->AppendText(_("Test 2 begins\n")); + TestLogger logtest("Test 2"); // We don't need to set flags because ReadMsg and WriteMsg // are not affected by them anyway. // Read the message - len = sock->ReadMsg(buf, MAX_MSG_SIZE * sizeof(wxChar)).LastCount(); - s.Printf(_("Client says: %s\n"), buf); - m_text->AppendText(s); - m_text->AppendText(_("Sending the data back\n")); + wxUint32 len = sock->ReadMsg(buf, sizeof(buf)).LastCount(); + if ( !len ) + { + wxLogError("Failed to read message."); + return; + } + + wxLogMessage("Got \"%s\" from client.", wxString::FromUTF8(buf, len)); + wxLogMessage("Sending the data back"); // Write it back sock->WriteMsg(buf, len); - delete[] buf; - - m_text->AppendText(_("Test 2 ends\n\n")); - -#undef MAX_MSG_SIZE } void MyFrame::Test3(wxSocketBase *sock) { - unsigned char len; - char *buf; - - m_text->AppendText(_("Test 3 begins\n")); + TestLogger logtest("Test 3"); // This test is similar to the first one, but the len is // expressed in kbytes - this tests large data transfers. @@ -292,18 +301,16 @@ void MyFrame::Test3(wxSocketBase *sock) sock->SetFlags(wxSOCKET_WAITALL); // Read the size + unsigned char len; sock->Read(&len, 1); - buf = new char[len * 1024]; + wxCharBuffer buf(len*1024); // Read the data - sock->Read(buf, len * 1024); - m_text->AppendText(_("Got the data, sending it back\n")); + sock->Read(buf.data(), len * 1024); + wxLogMessage("Got the data, sending it back"); // Write it back sock->Write(buf, len * 1024); - delete[] buf; - - m_text->AppendText(_("Test 3 ends\n\n")); } void MyFrame::OnServerEvent(wxSocketEvent& event) @@ -328,11 +335,11 @@ void MyFrame::OnServerEvent(wxSocketEvent& event) if (sock) { - m_text->AppendText(_("New client connection accepted\n\n")); + wxLogMessage("New client connection accepted"); } else { - m_text->AppendText(_("Error: couldn't accept a new connection\n\n")); + wxLogMessage("Error: couldn't accept a new connection"); return; } @@ -378,7 +385,7 @@ void MyFrame::OnSocketEvent(wxSocketEvent& event) case 0xCE: Test2(sock); break; case 0xDE: Test3(sock); break; default: - m_text->AppendText(_("Unknown test id received from client\n\n")); + wxLogMessage("Unknown test id received from client"); } // Enable input events again. @@ -398,7 +405,7 @@ void MyFrame::OnSocketEvent(wxSocketEvent& event) // middle of a test or something. Destroy() takes care of all // this for us. - m_text->AppendText(_("Deleting socket.\n\n")); + wxLogMessage("Deleting socket."); sock->Destroy(); break; } @@ -412,7 +419,9 @@ void MyFrame::OnSocketEvent(wxSocketEvent& event) void MyFrame::UpdateStatusBar() { +#if wxUSE_STATUSBAR wxString s; s.Printf(_("%d clients connected"), m_numClients); SetStatusText(s, 1); +#endif // wxUSE_STATUSBAR }