Ticket #12886: main.cpp

File main.cpp, 1.9 KB (added by ruslanch, 9 years ago)

Minimal example

Line 
1#include <wx/app.h>
2#include <wx/socket.h>
3
4class App : public wxApp
5{
6public:
7   bool OnInit();
8   int  OnExit();
9
10private:
11   void OnSocketEvent(wxSocketEvent& evt);
12
13   wxSocketServer* m_listeningSocket;
14
15   wxDECLARE_EVENT_TABLE();
16};
17
18class SocketThread : public wxThread
19{
20public:
21   SocketThread(wxSocketBase* socket);
22   ~SocketThread();
23   ExitCode Entry();
24
25private:
26   wxSocketBase* m_socket;
27};
28
29wxDECLARE_APP(App);
30wxIMPLEMENT_APP(App);
31
32wxBEGIN_EVENT_TABLE(App, wxApp)
33   EVT_SOCKET(wxID_ANY, App::OnSocketEvent)
34wxEND_EVENT_TABLE()
35
36bool App::OnInit()
37{
38   if ( !wxApp::OnInit() )
39      return false;
40
41   wxIPV4address la;
42   la.Service(12345);
43   m_listeningSocket = new wxSocketServer(la, wxSOCKET_NOWAIT | wxSOCKET_REUSEADDR);
44   m_listeningSocket->SetEventHandler(*this);
45   m_listeningSocket->SetNotify(wxSOCKET_CONNECTION_FLAG);
46   m_listeningSocket->Notify(true);
47
48   if (!m_listeningSocket->Ok())
49   {
50      wxLogError("Cannot bind listening socket");
51      return false;
52   }
53
54   return true;
55}
56
57int  App::OnExit()
58{
59
60   return wxApp::OnExit();
61}
62
63void App::OnSocketEvent(wxSocketEvent& evt)
64{
65   if ( evt.GetSocketEvent() == wxSOCKET_CONNECTION )
66   {
67      wxSocketBase* socket = m_listeningSocket->Accept();
68      if ( socket )
69      {
70         SocketThread* thread = new SocketThread(socket);
71         if ( thread->Create() == wxTHREAD_NO_ERROR )
72         {
73            thread->Run();
74         }
75         else
76         {
77            delete thread;
78            wxLogError("Can't run socket thread");
79         }
80      }
81   }
82}
83
84SocketThread::SocketThread(wxSocketBase* socket)
85   : wxThread(wxTHREAD_DETACHED)
86   , m_socket(socket)
87{
88   m_socket->Notify(false);
89   m_socket->SetFlags(wxSOCKET_BLOCK);
90}
91
92SocketThread::~SocketThread()
93{
94   if ( m_socket )
95      m_socket->Destroy();
96}
97
98SocketThread::ExitCode SocketThread::Entry()
99{
100   wxByte buf[1024];
101   m_socket->Read(buf, sizeof buf);
102   m_socket->Destroy();
103   m_socket = NULL;
104   
105   return NULL;
106}