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
This commit is contained in:
Vadim Zeitlin
2009-08-21 15:25:09 +00:00
parent d94e9b623a
commit 1b4b608091
2 changed files with 21 additions and 3 deletions

View File

@@ -2,10 +2,10 @@
// Name: server.cpp // Name: server.cpp
// Purpose: Server for wxSocket demo // Purpose: Server for wxSocket demo
// Author: Guillermo Rodriguez Garcia <guille@iies.es> // Author: Guillermo Rodriguez Garcia <guille@iies.es>
// Modified by:
// Created: 1999/09/19 // Created: 1999/09/19
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) 1999 Guillermo Rodriguez Garcia // Copyright: (c) 1999 Guillermo Rodriguez Garcia
// (c) 2009 Vadim Zeitlin
// Licence: wxWindows licence // Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@@ -29,6 +29,7 @@
# include "wx/wx.h" # include "wx/wx.h"
#endif #endif
#include "wx/busyinfo.h"
#include "wx/socket.h" #include "wx/socket.h"
// this example is currently written to use only IP or only IPv6 sockets, it // 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) // event handlers (these functions should _not_ be virtual)
void OnUDPTest(wxCommandEvent& event); void OnUDPTest(wxCommandEvent& event);
void OnWaitForAccept(wxCommandEvent& event);
void OnQuit(wxCommandEvent& event); void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event); void OnAbout(wxCommandEvent& event);
void OnServerEvent(wxSocketEvent& event); void OnServerEvent(wxSocketEvent& event);
@@ -117,6 +119,7 @@ enum
{ {
// menu items // menu items
SERVER_UDPTEST = 10, SERVER_UDPTEST = 10,
SERVER_WAITFORACCEPT,
SERVER_QUIT = wxID_EXIT, SERVER_QUIT = wxID_EXIT,
SERVER_ABOUT = wxID_ABOUT, SERVER_ABOUT = wxID_ABOUT,
@@ -133,6 +136,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(SERVER_QUIT, MyFrame::OnQuit) EVT_MENU(SERVER_QUIT, MyFrame::OnQuit)
EVT_MENU(SERVER_ABOUT, MyFrame::OnAbout) EVT_MENU(SERVER_ABOUT, MyFrame::OnAbout)
EVT_MENU(SERVER_UDPTEST, MyFrame::OnUDPTest) EVT_MENU(SERVER_UDPTEST, MyFrame::OnUDPTest)
EVT_MENU(SERVER_WAITFORACCEPT, MyFrame::OnWaitForAccept)
EVT_SOCKET(SERVER_ID, MyFrame::OnServerEvent) EVT_SOCKET(SERVER_ID, MyFrame::OnServerEvent)
EVT_SOCKET(SOCKET_ID, MyFrame::OnSocketEvent) EVT_SOCKET(SOCKET_ID, MyFrame::OnSocketEvent)
END_EVENT_TABLE() END_EVENT_TABLE()
@@ -179,6 +183,7 @@ MyFrame::MyFrame() : wxFrame((wxFrame *)NULL, wxID_ANY,
// Make menus // Make menus
m_menuFile = new wxMenu(); 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->Append(SERVER_UDPTEST, "&UDP test\tCtrl-U");
m_menuFile->AppendSeparator(); m_menuFile->AppendSeparator();
m_menuFile->Append(SERVER_ABOUT, _("&About...\tCtrl-A"), _("Show about dialog")); 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) void MyFrame::Test1(wxSocketBase *sock)
{ {
TestLogger logtest("Test 1"); TestLogger logtest("Test 1");

View File

@@ -1355,8 +1355,10 @@ wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags)
{ {
wxCHECK_MSG( m_impl, -1, "can't wait on invalid socket" ); 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) // we're never going to become ready in a client if we're not connected any
if ( !m_connected && !m_establishing ) // 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; return -1;
// This can be set to true from Interrupt() to exit this function a.s.a.p. // This can be set to true from Interrupt() to exit this function a.s.a.p.