| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        samples/sockbase/client.cpp
 
- // Purpose:     Sockets sample for wxBase
 
- // Author:      Lukasz Michalski
 
- // Modified by:
 
- // Created:     27.06.2005
 
- // Copyright:   (c) 2005 Lukasz Michalski <lmichalski@sf.net>
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- // ============================================================================
 
- // declarations
 
- // ============================================================================
 
- // ----------------------------------------------------------------------------
 
- // headers
 
- // ----------------------------------------------------------------------------
 
- #include "wx/wx.h"
 
- #include "wx/socket.h"
 
- #include "wx/event.h"
 
- #include "wx/list.h"
 
- #include "wx/cmdline.h"
 
- #include "wx/ffile.h"
 
- #include "wx/datetime.h"
 
- #include "wx/timer.h"
 
- #include "wx/thread.h"
 
- const wxEventType wxEVT_WORKER = wxNewEventType();
 
- #define EVT_WORKER(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_WORKER, -1, -1, (wxObjectEventFunction) (wxEventFunction) (WorkerEventFunction) & func, (wxObject *) NULL ),
 
- const int timeout_val = 1000;
 
- class WorkerEvent : public wxEvent {
 
- public:
 
-     typedef enum {
 
-         CONNECTING,
 
-         SENDING,
 
-         RECEIVING,
 
-         DISCONNECTING,
 
-         DONE
 
-     } evt_type;
 
-     WorkerEvent(void* pSender, evt_type type)
 
-     {
 
-         SetId(-1);
 
-         SetEventType(wxEVT_WORKER);
 
-         m_sender = pSender;
 
-         m_eventType = type;
 
-         m_isFailed = false;
 
-     }
 
-     void setFailed() { m_isFailed = true; }
 
-     bool isFailed() const { return m_isFailed; }
 
-     virtual wxEvent* Clone() const
 
-     {
 
-         return new WorkerEvent(*this);
 
-     }
 
-     void* m_sender;
 
-     bool m_isFailed;
 
-     wxString m_workerIdent;
 
-     evt_type m_eventType;
 
- };
 
- typedef void (wxEvtHandler::*WorkerEventFunction)(WorkerEvent&);
 
- class ThreadWorker;
 
- class EventWorker;
 
- WX_DECLARE_LIST(ThreadWorker, TList);
 
- WX_DECLARE_LIST(EventWorker, EList);
 
- class Client : public wxApp {
 
-     wxDECLARE_EVENT_TABLE();
 
- public:
 
-     void RemoveEventWorker(EventWorker* p_worker);
 
- private:
 
-     typedef enum
 
-     {
 
-       THREADS,
 
-       EVENTS
 
-     } workMode;
 
-     typedef enum
 
-     {
 
-       SEND_RANDOM,
 
-       SEND_MESSAGE,
 
-       STRESS_TEST
 
-     } sendType;
 
-     workMode m_workMode;
 
-     sendType m_sendType;
 
-     wxString m_message;
 
-     wxString m_host;
 
-     long m_stressWorkers;
 
-     virtual bool OnInit();
 
-     virtual int OnRun();
 
-     virtual int OnExit();
 
-     void OnInitCmdLine(wxCmdLineParser& pParser);
 
-     bool OnCmdLineParsed(wxCmdLineParser& pParser);
 
-     void OnWorkerEvent(WorkerEvent& pEvent);
 
-     void OnTimerEvent(wxTimerEvent& pEvent);
 
-     void StartWorker(workMode pMode, const wxString& pMessage);
 
-     void StartWorker(workMode pMode);
 
-     char* CreateBuffer(int *msgsize);
 
-     void dumpStatistics();
 
-     TList m_threadWorkers;
 
-     EList m_eventWorkers;
 
-     unsigned m_statConnecting;
 
-     unsigned m_statSending;
 
-     unsigned m_statReceiving;
 
-     unsigned m_statDisconnecting;
 
-     unsigned m_statDone;
 
-     unsigned m_statFailed;
 
-     wxTimer mTimer;
 
- };
 
- DECLARE_APP(Client);
 
- class ThreadWorker : public wxThread
 
- {
 
- public:
 
-     ThreadWorker(const wxString& p_host, char* p_buf, int p_size);
 
-     virtual ExitCode Entry();
 
- private:
 
-     wxString m_host;
 
-     wxSocketClient* m_clientSocket;
 
-     char* m_inbuf;
 
-     char* m_outbuf;
 
-     int m_outsize;
 
-     int m_insize;
 
-     wxString m_workerIdent;
 
- };
 
- class EventWorker : public wxEvtHandler
 
- {
 
-     wxDECLARE_EVENT_TABLE();
 
- public:
 
-     EventWorker(const wxString& p_host, char* p_buf, int p_size);
 
-     void Run();
 
-     virtual ~EventWorker();
 
- private:
 
-     wxString m_host;
 
-     wxSocketClient* m_clientSocket;
 
-     char* m_inbuf;
 
-     char* m_outbuf;
 
-     int m_outsize;
 
-     int m_written;
 
-     int m_insize;
 
-     int m_readed;
 
-     WorkerEvent::evt_type m_currentType;
 
-     bool m_doneSent;
 
-     wxIPV4address m_localaddr;
 
-     void OnSocketEvent(wxSocketEvent& pEvent);
 
-     void SendEvent(bool failed);
 
- };
 
- /******************* Implementation ******************/
 
- IMPLEMENT_APP_CONSOLE(Client);
 
- #include <wx/listimpl.cpp>
 
- WX_DEFINE_LIST(TList);
 
- WX_DEFINE_LIST(EList);
 
- wxString
 
- CreateIdent(const wxIPV4address& addr)
 
- {
 
-     return wxString::Format(wxT("%s:%d"),addr.IPAddress().c_str(),addr.Service());
 
- }
 
- void
 
- Client::OnInitCmdLine(wxCmdLineParser& pParser)
 
- {
 
-     wxApp::OnInitCmdLine(pParser);
 
-     pParser.AddSwitch(wxT("e"),wxT("event"),_("Use event based worker (default)"),wxCMD_LINE_PARAM_OPTIONAL);
 
-     pParser.AddSwitch(wxT("t"),wxT("thread"),_("Use thread based worker"),wxCMD_LINE_PARAM_OPTIONAL);
 
-     pParser.AddSwitch(wxT("r"),wxT("random"),_("Send radnom data (default)"),wxCMD_LINE_PARAM_OPTIONAL);
 
-     pParser.AddOption(wxT("m"),wxT("message"),_("Send message from <str>"),wxCMD_LINE_VAL_STRING,wxCMD_LINE_PARAM_OPTIONAL);
 
-     pParser.AddOption(wxT("f"),wxT("file"),_("Send contents of <file>"),wxCMD_LINE_VAL_STRING,wxCMD_LINE_PARAM_OPTIONAL);
 
-     pParser.AddOption(wxT("H"),wxT("hostname"),_("IP or name of host to connect to"),wxCMD_LINE_VAL_STRING,wxCMD_LINE_PARAM_OPTIONAL);
 
-     pParser.AddOption(wxT("s"),wxT("stress"),_("stress test with <num> concurrent connections"),wxCMD_LINE_VAL_NUMBER,wxCMD_LINE_PARAM_OPTIONAL);
 
- }
 
- bool
 
- Client::OnCmdLineParsed(wxCmdLineParser& pParser)
 
- {
 
-     wxString fname;
 
-     m_workMode = EVENTS;
 
-     m_stressWorkers = 50;
 
-     if (pParser.Found(_("verbose")))
 
-     {
 
-         wxLog::AddTraceMask(wxT("wxSocket"));
 
-         wxLog::AddTraceMask(wxT("epolldispatcher"));
 
-         wxLog::AddTraceMask(wxT("selectdispatcher"));
 
-         wxLog::AddTraceMask(wxT("thread"));
 
-         wxLog::AddTraceMask(wxT("events"));
 
-     }
 
-     if (pParser.Found(wxT("t")))
 
-         m_workMode = THREADS;
 
-     m_sendType = SEND_RANDOM;
 
-     if (pParser.Found(wxT("m"),&m_message))
 
-         m_sendType = SEND_MESSAGE;
 
-     else if (pParser.Found(wxT("f"),&fname))
 
-     {
 
-         wxFFile file(fname);
 
-         if (!file.IsOpened()) {
 
-             wxLogError(wxT("Cannot open file %s"),fname.c_str());
 
-             return false;
 
-         };
 
-         if (!file.ReadAll(&m_message)) {
 
-             wxLogError(wxT("Cannot read conten of file %s"),fname.c_str());
 
-             return false;
 
-         };
 
-         m_sendType = SEND_MESSAGE;
 
-     };
 
-     if (pParser.Found(wxT("s"),&m_stressWorkers))
 
-         m_sendType = STRESS_TEST;
 
-     m_host = wxT("127.0.0.1");
 
-     pParser.Found(wxT("H"),&m_host);
 
-     return wxApp::OnCmdLineParsed(pParser);
 
- };
 
- bool
 
- Client::OnInit()
 
- {
 
-     if (!wxApp::OnInit())
 
-         return false;
 
-     srand(wxDateTime::Now().GetTicks());
 
-     mTimer.SetOwner(this);
 
-     m_statConnecting = 0;
 
-     m_statSending = 0;
 
-     m_statReceiving = 0;
 
-     m_statDisconnecting = 0;
 
-     m_statDone = 0;
 
-     m_statFailed = 0;
 
-     return true;
 
- }
 
- int
 
- Client::OnRun()
 
- {
 
-     int i;
 
-     switch(m_sendType)
 
-     {
 
-         case STRESS_TEST:
 
-             switch(m_workMode)
 
-             {
 
-                 case THREADS:
 
-                     for (i = 0; i < m_stressWorkers; i++) {
 
-                         if (m_message.empty())
 
-                             StartWorker(THREADS);
 
-                         else
 
-                             StartWorker(THREADS, m_message);
 
-                     }
 
-                     break;
 
-                 case EVENTS:
 
-                     for (i = 0; i < m_stressWorkers; i++) {
 
-                         if (m_message.empty())
 
-                             StartWorker(EVENTS);
 
-                         else
 
-                             StartWorker(EVENTS, m_message);
 
-                     }
 
-                     break;
 
-                 default:
 
-                     for (i = 0; i < m_stressWorkers; i++) {
 
-                         if (m_message.empty())
 
-                             StartWorker(i % 5 == 0 ? THREADS : EVENTS);
 
-                         else
 
-                             StartWorker(i % 5 == 0 ? THREADS : EVENTS, m_message);
 
-                     }
 
-                 break;
 
-             }
 
-         break;
 
-         case SEND_MESSAGE:
 
-             StartWorker(m_workMode,m_message);
 
-         break;
 
-         case SEND_RANDOM:
 
-             StartWorker(m_workMode);
 
-         break;
 
-     }
 
-     mTimer.Start(timeout_val,true);
 
-     return wxApp::OnRun();
 
- }
 
- int
 
- Client::OnExit()
 
- {
 
-     for(EList::compatibility_iterator it = m_eventWorkers.GetFirst(); it ; it->GetNext()) {
 
-         delete it->GetData();
 
-     }
 
-     return 0;
 
- }
 
- // Create buffer to be sent by client. Buffer contains test indicator
 
- // message size and place for data
 
- // msgsize parameter contains size of data in bytes and
 
- // if input value does not fit into 250 bytes then
 
- // on exit is updated to new value that is multiply of 1024 bytes
 
- char*
 
- Client::CreateBuffer(int* msgsize)
 
- {
 
-     int bufsize = 0;
 
-     char* buf;
 
-     //if message should have more than 256 bytes then set it as
 
-     //test3 for compatibility with GUI server sample
 
-     if ((*msgsize) > 250)
 
-     {
 
-         //send at least one kb of data
 
-         int size = (*msgsize)/1024 + 1;
 
-         //returned buffer will contain test indicator, message size in kb and data
 
-         bufsize = size*1024+2;
 
-         buf = new char[bufsize];
 
-         buf[0] = (unsigned char)0xDE; //second byte contains size in kilobytes
 
-         buf[1] = (char)(size);
 
-         *msgsize = size*1024;
 
-     }
 
-     else
 
-     {
 
-         //returned buffer will contain test indicator, message size in kb and data
 
-         bufsize = (*msgsize)+2;
 
-         buf = new char[bufsize];
 
-         buf[0] = (unsigned char)0xBE; //second byte contains size in bytes
 
-         buf[1] = (char)(*msgsize);
 
-     }
 
-     return buf;
 
- }
 
- void
 
- Client::StartWorker(workMode pMode) {
 
-     int msgsize = 1 + (int) (250000.0 * (rand() / (RAND_MAX + 1.0)));
 
-     char* buf = CreateBuffer(&msgsize);
 
-     //fill data part of buffer with random bytes
 
-     for (int i = 2; i < (msgsize); i++) {
 
-         buf[i] = i % 256;
 
-     }
 
-     if (pMode == THREADS) {
 
-         ThreadWorker* c = new ThreadWorker(m_host,buf,msgsize+2);
 
-         if (c->Create() != wxTHREAD_NO_ERROR) {
 
-             wxLogError(wxT("Cannot create more threads"));
 
-         } else {
 
-             c->Run();
 
-             m_threadWorkers.Append(c);
 
-         }
 
-     } else {
 
-         EventWorker* e = new EventWorker(m_host,buf,msgsize+2);
 
-         e->Run();
 
-         m_eventWorkers.Append(e);
 
-     }
 
-     m_statConnecting++;
 
- }
 
- void
 
- Client::StartWorker(workMode pMode, const wxString& pMessage) {
 
-     char* tmpbuf = wxStrdup(pMessage.mb_str());
 
-     int msgsize = strlen(tmpbuf);
 
-     char* buf = CreateBuffer(&msgsize);
 
-     memset(buf+2,0x0,msgsize);
 
-     memcpy(buf+2,tmpbuf,msgsize);
 
-     free(tmpbuf);
 
-     if (pMode == THREADS) {
 
-         ThreadWorker* c = new ThreadWorker(m_host,buf,msgsize+2);
 
-         if (c->Create() != wxTHREAD_NO_ERROR) {
 
-             wxLogError(wxT("Cannot create more threads"));
 
-         } else {
 
-             c->Run();
 
-             m_threadWorkers.Append(c);
 
-         }
 
-     } else {
 
-         EventWorker* e = new EventWorker(m_host,buf,msgsize+2);
 
-         e->Run();
 
-         m_eventWorkers.Append(e);
 
-     }
 
-     m_statConnecting++;
 
- }
 
- void
 
- Client::OnWorkerEvent(WorkerEvent& pEvent) {
 
-     switch (pEvent.m_eventType) {
 
-         case WorkerEvent::CONNECTING:
 
-             if (pEvent.isFailed())
 
-             {
 
-                 m_statConnecting--;
 
-                 m_statFailed++;
 
-             }
 
-         break;
 
-         case WorkerEvent::SENDING:
 
-             if (pEvent.isFailed())
 
-             {
 
-                 m_statFailed++;
 
-                 m_statSending--;
 
-             }
 
-             else
 
-             {
 
-                 m_statConnecting--;
 
-                 m_statSending++;
 
-             }
 
-         break;
 
-         case WorkerEvent::RECEIVING:
 
-             if (pEvent.isFailed())
 
-             {
 
-                 m_statReceiving--;
 
-                 m_statFailed++;
 
-             }
 
-             else
 
-             {
 
-                 m_statSending--;
 
-                 m_statReceiving++;
 
-             }
 
-         break;
 
-         case WorkerEvent::DISCONNECTING:
 
-             if (pEvent.isFailed())
 
-             {
 
-                 m_statDisconnecting--;
 
-                 m_statFailed++;
 
-             }
 
-             else
 
-             {
 
-                 m_statReceiving--;
 
-                 m_statDisconnecting++;
 
-             }
 
-         break;
 
-         case WorkerEvent::DONE:
 
-             m_statDone++;
 
-             m_statDisconnecting--;
 
-         break;
 
-     };
 
-     if (pEvent.isFailed() || pEvent.m_eventType == WorkerEvent::DONE)
 
-     {
 
-         for(TList::compatibility_iterator it = m_threadWorkers.GetFirst(); it ; it = it->GetNext()) {
 
-             if (it->GetData() == pEvent.m_sender) {
 
-                 m_threadWorkers.DeleteNode(it);
 
-                 break;
 
-             }
 
-         }
 
-         for(EList::compatibility_iterator it2 = m_eventWorkers.GetFirst(); it2 ; it2 = it2->GetNext())
 
-         {
 
-             if (it2->GetData() == pEvent.m_sender) {
 
-                 delete it2->GetData();
 
-                 m_eventWorkers.DeleteNode(it2);
 
-                 break;
 
-             }
 
-         }
 
-         if ((m_threadWorkers.GetCount() == 0) && (m_eventWorkers.GetCount() == 0))
 
-         {
 
-             mTimer.Stop();
 
-             dumpStatistics();
 
-             wxSleep(2);
 
-             ExitMainLoop();
 
-         }
 
-         else
 
-         {
 
-             mTimer.Start(timeout_val,true);
 
-         }
 
-     }
 
- }
 
- void
 
- Client::RemoveEventWorker(EventWorker* p_worker) {
 
-     for(EList::compatibility_iterator it = m_eventWorkers.GetFirst(); it ; it = it->GetNext()) {
 
-         if (it->GetData() == p_worker) {
 
-             //wxLogDebug(wxT("Deleting event worker"));
 
-             delete it->GetData();
 
-             m_eventWorkers.DeleteNode(it);
 
-             return;
 
-         }
 
-     }
 
- }
 
- void
 
- Client::dumpStatistics() {
 
-     wxString msg(
 
-         wxString::Format(_("Connecting:\t%d\nSending\t\t%d\nReceiving\t%d\nDisconnecting:\t%d\nDone:\t\t%d\nFailed:\t\t%d\n"),
 
-                 m_statConnecting,
 
-                 m_statSending,
 
-                 m_statReceiving,
 
-                 m_statDisconnecting,
 
-                 m_statDone,
 
-                 m_statFailed
 
-                 ));
 
-     wxLogMessage(wxT("Current status:\n%s\n"),msg.c_str());
 
- }
 
- void
 
- Client::OnTimerEvent(wxTimerEvent&) {
 
-     dumpStatistics();
 
- }
 
- wxBEGIN_EVENT_TABLE(Client,wxEvtHandler)
 
-     EVT_WORKER(Client::OnWorkerEvent)
 
-     EVT_TIMER(wxID_ANY,Client::OnTimerEvent)
 
- wxEND_EVENT_TABLE()
 
- EventWorker::EventWorker(const wxString& p_host, char* p_buf, int p_size)
 
-   : m_host(p_host),
 
-     m_outbuf(p_buf),
 
-     m_outsize(p_size),
 
-     m_written(0),
 
-     m_readed(0)
 
- {
 
-     m_clientSocket = new wxSocketClient(wxSOCKET_NOWAIT);
 
-     m_clientSocket->SetEventHandler(*this);
 
-     m_insize = m_outsize - 2;
 
-     m_inbuf = new char[m_insize];
 
- }
 
- void
 
- EventWorker::Run() {
 
-     wxIPV4address ca;
 
-     ca.Hostname(m_host);
 
-     ca.Service(3000);
 
-     m_clientSocket->SetNotify(wxSOCKET_CONNECTION_FLAG|wxSOCKET_LOST_FLAG|wxSOCKET_OUTPUT_FLAG|wxSOCKET_INPUT_FLAG);
 
-     m_clientSocket->Notify(true);
 
-     m_currentType = WorkerEvent::CONNECTING;
 
-     m_doneSent = false;
 
-     //wxLogMessage(wxT("EventWorker: Connecting....."));
 
-     m_clientSocket->Connect(ca,false);
 
- }
 
- void
 
- EventWorker::OnSocketEvent(wxSocketEvent& pEvent) {
 
-     switch(pEvent.GetSocketEvent()) {
 
-         case wxSOCKET_INPUT:
 
-             //wxLogDebug(wxT("EventWorker: INPUT"));
 
-             do {
 
-                 if (m_readed == m_insize)
 
-                     return; //event already posted
 
-                 m_clientSocket->Read(m_inbuf + m_readed, m_insize - m_readed);
 
-                 if (m_clientSocket->Error())
 
-                 {
 
-                     if (m_clientSocket->LastError() != wxSOCKET_WOULDBLOCK)
 
-                     {
 
-                         wxLogError(wxT("%s: read error"),CreateIdent(m_localaddr).c_str());
 
-                         SendEvent(true);
 
-                     }
 
-                 }
 
-                 m_readed += m_clientSocket->LastCount();
 
-                 //wxLogDebug(wxT("EventWorker: readed %d bytes, %d bytes to do"),m_clientSocket->LastCount(), m_insize - m_readed);
 
-                 if (m_readed == m_insize)
 
-                 {
 
-                     if (!memcmp(m_inbuf,m_outbuf,m_insize)) {
 
-                         wxLogError(wxT("%s: data mismatch"),CreateIdent(m_localaddr).c_str());
 
-                         SendEvent(true);
 
-                     }
 
-                     m_currentType = WorkerEvent::DISCONNECTING;
 
-                     wxLogDebug(wxT("%s: DISCONNECTING"),CreateIdent(m_localaddr).c_str());
 
-                     SendEvent(false);
 
-                     //wxLogDebug(wxT("EventWorker %p closing"),this);
 
-                     m_clientSocket->Close();
 
-                     m_currentType = WorkerEvent::DONE;
 
-                     wxLogDebug(wxT("%s: DONE"),CreateIdent(m_localaddr).c_str());
 
-                     SendEvent(false);
 
-                 }
 
-             } while (!m_clientSocket->Error());
 
-         break;
 
-         case wxSOCKET_OUTPUT:
 
-             //wxLogDebug(wxT("EventWorker: OUTPUT"));
 
-             do {
 
-                 if (m_written == m_outsize)
 
-                     return;
 
-                 if (m_written == 0)
 
-                 {
 
-                     m_currentType = WorkerEvent::SENDING;
 
-                     wxLogDebug(wxT("%s: SENDING"),CreateIdent(m_localaddr).c_str());
 
-                 }
 
-                 m_clientSocket->Write(m_outbuf + m_written, m_outsize - m_written);
 
-                 if (m_clientSocket->Error())
 
-                 {
 
-                     if (m_clientSocket->LastError() != wxSOCKET_WOULDBLOCK) {
 
-                         wxLogError(wxT("%s: Write error"),CreateIdent(m_localaddr).c_str());
 
-                         SendEvent(true);
 
-                     }
 
-                 }
 
-                 m_written += m_clientSocket->LastCount();
 
-                 if (m_written != m_outsize)
 
-                 {
 
-                     //wxLogDebug(wxT("EventWorker: written %d bytes, %d bytes to do"),m_clientSocket->LastCount(),m_outsize - m_written);
 
-                 }
 
-                 else
 
-                 {
 
-                     //wxLogDebug(wxT("EventWorker %p SENDING->RECEIVING"),this);
 
-                     m_currentType = WorkerEvent::RECEIVING;
 
-                     wxLogDebug(wxT("%s: RECEIVING"),CreateIdent(m_localaddr).c_str());
 
-                     SendEvent(false);
 
-                 }
 
-             } while(!m_clientSocket->Error());
 
-         break;
 
-         case wxSOCKET_CONNECTION:
 
-         {
 
-             //wxLogMessage(wxT("EventWorker: got connection"));
 
-             wxLogMessage(wxT("%s: starting writing message (2 bytes for signature and %d bytes of data to write)"),CreateIdent(m_localaddr).c_str(),m_outsize-2);
 
-             if (!m_clientSocket->GetLocal(m_localaddr))
 
-             {
 
-                 wxLogError(_("Cannot get peer data for socket %p"),m_clientSocket);
 
-             }
 
-             m_currentType = WorkerEvent::SENDING;
 
-             wxLogDebug(wxT("%s: CONNECTING"),CreateIdent(m_localaddr).c_str());
 
-             SendEvent(false);
 
-         }
 
-         break;
 
-         case wxSOCKET_LOST:
 
-         {
 
-             wxLogError(_("%s: connection lost"),CreateIdent(m_localaddr).c_str());
 
-             SendEvent(true);
 
-         }
 
-         break;
 
-     }
 
- }
 
- void
 
- EventWorker::SendEvent(bool failed) {
 
-     if (m_doneSent)
 
-         return;
 
-     WorkerEvent e(this,m_currentType);
 
-     if (failed) e.setFailed();
 
-     wxGetApp().AddPendingEvent(e);
 
-     m_doneSent = failed || m_currentType == WorkerEvent::DONE;
 
- };
 
- EventWorker::~EventWorker() {
 
-     m_clientSocket->Destroy();
 
-     delete [] m_outbuf;
 
-     delete [] m_inbuf;
 
- }
 
- wxBEGIN_EVENT_TABLE(EventWorker,wxEvtHandler)
 
-     EVT_SOCKET(wxID_ANY,EventWorker::OnSocketEvent)
 
- wxEND_EVENT_TABLE()
 
- ThreadWorker::ThreadWorker(const wxString& p_host, char* p_buf, int p_size)
 
-   : wxThread(wxTHREAD_DETACHED),
 
-     m_host(p_host),
 
-     m_outbuf(p_buf),
 
-     m_outsize(p_size)
 
- {
 
-     m_clientSocket = new wxSocketClient(wxSOCKET_BLOCK|wxSOCKET_WAITALL);
 
-     m_insize = m_outsize - 2;
 
-     m_inbuf = new char[m_insize];
 
- }
 
- wxThread::ExitCode ThreadWorker::Entry()
 
- {
 
-     wxIPV4address ca;
 
-     ca.Hostname(m_host);
 
-     ca.Service(5678);
 
-     //wxLogDebug(wxT("ThreadWorker: Connecting....."));
 
-     m_clientSocket->SetTimeout(60);
 
-     bool failed = false;
 
-     WorkerEvent::evt_type etype = WorkerEvent::CONNECTING;
 
-     if (!m_clientSocket->Connect(ca)) {
 
-         wxLogError(wxT("Cannot connect to %s:%d"),ca.IPAddress().c_str(), ca.Service());
 
-         failed = true;
 
-     } else {
 
-         //wxLogMessage(wxT("ThreadWorker: Connected. Sending %d bytes of data"),m_outsize);
 
-         etype = WorkerEvent::SENDING;
 
-         WorkerEvent e(this,etype);
 
-         wxGetApp().AddPendingEvent(e);
 
-         int to_process = m_outsize;
 
-         do {
 
-             m_clientSocket->Write(m_outbuf,m_outsize);
 
-             if (m_clientSocket->Error()) {
 
-                 wxLogError(wxT("ThreadWorker: Write error"));
 
-                 failed  = true;
 
-             }
 
-             to_process -= m_clientSocket->LastCount();
 
-             //wxLogDebug(wxT("EventWorker: written %d bytes, %d bytes to do"),m_clientSocket->LastCount(),to_process);
 
-         } while(!m_clientSocket->Error() && to_process != 0);
 
-         if (!failed) {
 
-             etype = WorkerEvent::RECEIVING;
 
-             WorkerEvent e(this,etype);
 
-             wxGetApp().AddPendingEvent(e);
 
-             to_process = m_insize;
 
-             do {
 
-                 m_clientSocket->Read(m_inbuf,m_insize);
 
-                 if (m_clientSocket->Error()) {
 
-                     wxLogError(wxT("ThreadWorker: Read error"));
 
-                     failed = true;
 
-                     break;
 
-                 }
 
-                 to_process -= m_clientSocket->LastCount();
 
-                 //wxLogDebug(wxT("EventWorker: readed %d bytes, %d bytes to do"),m_clientSocket->LastCount(),to_process);
 
-             } while(!m_clientSocket->Error() && to_process != 0);
 
-         }
 
-         char* outdat = (char*)m_outbuf+2;
 
-         if (!failed && (memcmp(m_inbuf,outdat,m_insize) != 0))
 
-         {
 
-             wxLogError(wxT("Data mismatch"));
 
-             failed = true;
 
-         }
 
-     }
 
-     //wxLogDebug(wxT("ThreadWorker: Finished"));
 
-     if (!failed) {
 
-         etype = WorkerEvent::DISCONNECTING;
 
-         WorkerEvent e(this,etype);
 
-         wxGetApp().AddPendingEvent(e);
 
-     };
 
-     m_clientSocket->Close();
 
-     m_clientSocket->Destroy();
 
-     m_clientSocket = NULL;
 
-     delete [] m_outbuf;
 
-     delete [] m_inbuf;
 
-     if (!failed)
 
-         etype = WorkerEvent::DONE;
 
-     WorkerEvent e(this,etype);
 
-     if (failed) e.setFailed();
 
-     wxGetApp().AddPendingEvent(e);
 
-     return 0;
 
- }
 
 
  |