From: Vadim Zeitlin Date: Sun, 25 Jul 2004 11:16:31 +0000 (+0000) Subject: basic UDP support (patch 835128) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/bfa7bf7d6b75e4fa31db205cf0b339c28ea6d090 basic UDP support (patch 835128) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28453 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index f21eff65f6..49816121ee 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -204,6 +204,7 @@ All: - support msgids in charsets other than C and languages other than English (based on patch by Stefan Kowski) - added wxMicroSleep() and wxMilliSleep() replacing deprecated wxUsleep() +- basic UDP sockets support (Lenny Maiorani) All (GUI): diff --git a/include/wx/gsocket.h b/include/wx/gsocket.h index 857cc04c53..9916b9771e 100644 --- a/include/wx/gsocket.h +++ b/include/wx/gsocket.h @@ -79,7 +79,8 @@ typedef enum { GSOCK_INVPORT, GSOCK_WOULDBLOCK, GSOCK_TIMEDOUT, - GSOCK_MEMERR + GSOCK_MEMERR, + GSOCK_OPTERR, } GSocketError; /* See below for an explanation on how events work. @@ -271,6 +272,14 @@ int GSocket_Write(GSocket *socket, const char *buffer, */ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags); +GSocketError GSocket_GetSockOpt(GSocket *socket, int level, int optname, + void *optval, int *optlen); + +GSocketError GSocket_SetSockOpt(GSocket *socket, int level, int optname, + const void *optval, int optlen); + +void GSocket_Streamed(GSocket *socket); +void GSocket_Unstreamed(GSocket *socket); /* Attributes */ diff --git a/include/wx/socket.h b/include/wx/socket.h index 864ba4f96d..7b153c09d9 100644 --- a/include/wx/socket.h +++ b/include/wx/socket.h @@ -151,6 +151,10 @@ public: void SetFlags(wxSocketFlags flags); void SetTimeout(long seconds); + bool GetOption(int level, int optname, void *optval, int *optlen); + bool SetOption(int level, int optname, const void *optval, int optlen); + inline wxUint32 GetLastIOSize() const { return m_lcount; }; + // event handling void *GetClientData() const { return m_clientData; } void SetClientData(void *data) { m_clientData = data; } diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 4f26596193..5e8f4ff8de 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -754,6 +754,7 @@ bool wxSocketBase::WaitForRead(long seconds, long milliseconds) GSOCK_LOST_FLAG); } + bool wxSocketBase::WaitForWrite(long seconds, long milliseconds) { return _Wait(seconds, milliseconds, GSOCK_OUTPUT_FLAG); @@ -1126,6 +1127,27 @@ bool wxSocketServer::WaitForAccept(long seconds, long milliseconds) return _Wait(seconds, milliseconds, GSOCK_CONNECTION_FLAG); } +bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen) +{ + if (GSocket_GetSockOpt(m_socket, level, optname, optval, optlen) + != GSOCK_NOERROR) + { + return FALSE; + } + return TRUE; +} + +bool wxSocketBase::SetOption(int level, int optname, const void *optval, + int optlen) +{ + if (GSocket_SetSockOpt(m_socket, level, optname, optval, optlen) + != GSOCK_NOERROR) + { + return FALSE; + } + return TRUE; +} + // ========================================================================== // wxSocketClient // ========================================================================== @@ -1221,9 +1243,12 @@ wxDatagramSocket::wxDatagramSocket( wxSockAddress& addr, m_socket = GSocket_new(); if(!m_socket) + { + wxASSERT_MSG( 0, _T("datagram socket not new'd") ); return; - + } // Setup the socket as non connection oriented + GSocket_Unstreamed(m_socket); GSocket_SetLocal(m_socket, addr.GetAddress()); if( GSocket_SetNonOriented(m_socket) != GSOCK_NOERROR ) { diff --git a/src/msw/gsocket.c b/src/msw/gsocket.c index 4d6e01f624..c4f9345519 100644 --- a/src/msw/gsocket.c +++ b/src/msw/gsocket.c @@ -990,6 +990,36 @@ void GSocket_UnsetCallback(GSocket *socket, GSocketEventFlags flags) } } +GSocketError GSocket_GetSockOpt(GSocket *socket, int level, int optname, + void *optval, int *optlen) +{ + if (getsockopt(socket->m_fd, level, optname, optval, optlen) == 0) + { + return GSOCK_NOERROR; + } + return GSOCK_OPTERR; +} + +GSocketError GSocket_SetSockOpt(GSocket *socket, int level, int optname, + const void *optval, int optlen) +{ + if (setsockopt(socket->m_fd, level, optname, optval, optlen) == 0) + { + return GSOCK_NOERROR; + } + return GSOCK_OPTERR; +} + +void GSocket_Streamed(GSocket *socket) +{ + socket->m_stream = TRUE; +} + +void GSocket_Unstreamed(GSocket *socket) +{ + socket->m_stream = FALSE; +} + /* Internals (IO) */ /* _GSocket_Input_Timeout: @@ -1312,7 +1342,7 @@ GSocketError _GAddress_Init_INET(GAddress *address) } address->m_family = GSOCK_INET; - address->m_realfamily = PF_INET; + address->m_realfamily = AF_INET; ((struct sockaddr_in *)address->m_addr)->sin_family = AF_INET; ((struct sockaddr_in *)address->m_addr)->sin_addr.s_addr = INADDR_ANY; diff --git a/src/unix/gsocket.c b/src/unix/gsocket.c index 3f1c19c862..bc68887a40 100644 --- a/src/unix/gsocket.c +++ b/src/unix/gsocket.c @@ -1129,6 +1129,35 @@ void GSocket_UnsetCallback(GSocket *socket, GSocketEventFlags flags) } } +GSocketError GSocket_GetSockOpt(GSocket *socket, int level, int optname, + void *optval, int *optlen) +{ + if (getsockopt(socket->m_fd, level, optname, optval, optlen) == 0) + { + return GSOCK_NOERROR; + } + return GSOCK_OPTERR; +} + +GSocketError GSocket_SetSockOpt(GSocket *socket, int level, int optname, + const void *optval, int optlen) +{ + if (setsockopt(socket->m_fd, level, optname, optval, optlen) == 0) + { + return GSOCK_NOERROR; + } + return GSOCK_OPTERR; +} + +void GSocket_Streamed(GSocket *socket) +{ + socket->m_stream = TRUE; +} + +void GSocket_Unstreamed(GSocket *socket) +{ + socket->m_stream = FALSE; +} #define CALL_CALLBACK(socket, event) { \ _GSocket_Disable(socket, event); \