From 1b4b6080913e757f6900b9e0912ab9dab91561a6 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 21 Aug 2009 15:25:09 +0000 Subject: [PATCH] Do wait for connection in the server socket. The code returned immediately from wxSocketBase::DoWait() if it wasn't connected but it only made sense for the client sockets, not server ones which could be calling this function precisely in order to wait until a connection is made. Also added a test for this bug in the sockets/server sample. Closes #11107. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61726 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/sockets/server.cpp | 18 +++++++++++++++++- src/common/socket.cpp | 6 ++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/samples/sockets/server.cpp b/samples/sockets/server.cpp index a85ef5deac..6dcc04eb23 100644 --- a/samples/sockets/server.cpp +++ b/samples/sockets/server.cpp @@ -2,10 +2,10 @@ // Name: server.cpp // Purpose: Server for wxSocket demo // Author: Guillermo Rodriguez Garcia -// Modified by: // Created: 1999/09/19 // RCS-ID: $Id$ // Copyright: (c) 1999 Guillermo Rodriguez Garcia +// (c) 2009 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -29,6 +29,7 @@ # include "wx/wx.h" #endif +#include "wx/busyinfo.h" #include "wx/socket.h" // this example is currently written to use only IP or only IPv6 sockets, it @@ -66,6 +67,7 @@ public: // event handlers (these functions should _not_ be virtual) void OnUDPTest(wxCommandEvent& event); + void OnWaitForAccept(wxCommandEvent& event); void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); void OnServerEvent(wxSocketEvent& event); @@ -117,6 +119,7 @@ enum { // menu items SERVER_UDPTEST = 10, + SERVER_WAITFORACCEPT, SERVER_QUIT = wxID_EXIT, SERVER_ABOUT = wxID_ABOUT, @@ -133,6 +136,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(SERVER_QUIT, MyFrame::OnQuit) EVT_MENU(SERVER_ABOUT, MyFrame::OnAbout) EVT_MENU(SERVER_UDPTEST, MyFrame::OnUDPTest) + EVT_MENU(SERVER_WAITFORACCEPT, MyFrame::OnWaitForAccept) EVT_SOCKET(SERVER_ID, MyFrame::OnServerEvent) EVT_SOCKET(SOCKET_ID, MyFrame::OnSocketEvent) END_EVENT_TABLE() @@ -179,6 +183,7 @@ MyFrame::MyFrame() : wxFrame((wxFrame *)NULL, wxID_ANY, // Make menus m_menuFile = new wxMenu(); + m_menuFile->Append(SERVER_WAITFORACCEPT, "&Wait for connection\tCtrl-W"); m_menuFile->Append(SERVER_UDPTEST, "&UDP test\tCtrl-U"); m_menuFile->AppendSeparator(); m_menuFile->Append(SERVER_ABOUT, _("&About...\tCtrl-A"), _("Show about dialog")); @@ -296,6 +301,17 @@ void MyFrame::OnUDPTest(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnWaitForAccept(wxCommandEvent& WXUNUSED(event)) +{ + TestLogger logtest("WaitForAccept() test"); + + wxBusyInfo("Waiting for connection for 10 seconds...", this); + if ( m_server->WaitForAccept(10) ) + wxLogMessage("Accepted client connection."); + else + wxLogMessage("Connection error or timeout expired."); +} + void MyFrame::Test1(wxSocketBase *sock) { TestLogger logtest("Test 1"); diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 95778390a5..7e1aafd4a2 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -1355,8 +1355,10 @@ wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags) { wxCHECK_MSG( m_impl, -1, "can't wait on invalid socket" ); - // we're never going to become ready if we're not connected (any more) - if ( !m_connected && !m_establishing ) + // we're never going to become ready in a client if we're not connected any + // more (OTOH a server can call this to precisely wait for a connection so + // do wait for it in this case) + if ( !m_impl->IsServer() && !m_connected && !m_establishing ) return -1; // This can be set to true from Interrupt() to exit this function a.s.a.p. -- 2.47.2