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:
@@ -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");
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user