basic UDP support (patch 835128)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28453 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -204,6 +204,7 @@ All:
|
|||||||
- support msgids in charsets other than C and languages other than English
|
- support msgids in charsets other than C and languages other than English
|
||||||
(based on patch by Stefan Kowski)
|
(based on patch by Stefan Kowski)
|
||||||
- added wxMicroSleep() and wxMilliSleep() replacing deprecated wxUsleep()
|
- added wxMicroSleep() and wxMilliSleep() replacing deprecated wxUsleep()
|
||||||
|
- basic UDP sockets support (Lenny Maiorani)
|
||||||
|
|
||||||
All (GUI):
|
All (GUI):
|
||||||
|
|
||||||
|
@@ -79,7 +79,8 @@ typedef enum {
|
|||||||
GSOCK_INVPORT,
|
GSOCK_INVPORT,
|
||||||
GSOCK_WOULDBLOCK,
|
GSOCK_WOULDBLOCK,
|
||||||
GSOCK_TIMEDOUT,
|
GSOCK_TIMEDOUT,
|
||||||
GSOCK_MEMERR
|
GSOCK_MEMERR,
|
||||||
|
GSOCK_OPTERR,
|
||||||
} GSocketError;
|
} GSocketError;
|
||||||
|
|
||||||
/* See below for an explanation on how events work.
|
/* 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);
|
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 */
|
/* Attributes */
|
||||||
|
|
||||||
|
@@ -151,6 +151,10 @@ public:
|
|||||||
void SetFlags(wxSocketFlags flags);
|
void SetFlags(wxSocketFlags flags);
|
||||||
void SetTimeout(long seconds);
|
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
|
// event handling
|
||||||
void *GetClientData() const { return m_clientData; }
|
void *GetClientData() const { return m_clientData; }
|
||||||
void SetClientData(void *data) { m_clientData = data; }
|
void SetClientData(void *data) { m_clientData = data; }
|
||||||
|
@@ -754,6 +754,7 @@ bool wxSocketBase::WaitForRead(long seconds, long milliseconds)
|
|||||||
GSOCK_LOST_FLAG);
|
GSOCK_LOST_FLAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool wxSocketBase::WaitForWrite(long seconds, long milliseconds)
|
bool wxSocketBase::WaitForWrite(long seconds, long milliseconds)
|
||||||
{
|
{
|
||||||
return _Wait(seconds, milliseconds, GSOCK_OUTPUT_FLAG);
|
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);
|
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
|
// wxSocketClient
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
@@ -1221,9 +1243,12 @@ wxDatagramSocket::wxDatagramSocket( wxSockAddress& addr,
|
|||||||
m_socket = GSocket_new();
|
m_socket = GSocket_new();
|
||||||
|
|
||||||
if(!m_socket)
|
if(!m_socket)
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( 0, _T("datagram socket not new'd") );
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
// Setup the socket as non connection oriented
|
// Setup the socket as non connection oriented
|
||||||
|
GSocket_Unstreamed(m_socket);
|
||||||
GSocket_SetLocal(m_socket, addr.GetAddress());
|
GSocket_SetLocal(m_socket, addr.GetAddress());
|
||||||
if( GSocket_SetNonOriented(m_socket) != GSOCK_NOERROR )
|
if( GSocket_SetNonOriented(m_socket) != GSOCK_NOERROR )
|
||||||
{
|
{
|
||||||
|
@@ -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) */
|
/* Internals (IO) */
|
||||||
|
|
||||||
/* _GSocket_Input_Timeout:
|
/* _GSocket_Input_Timeout:
|
||||||
@@ -1312,7 +1342,7 @@ GSocketError _GAddress_Init_INET(GAddress *address)
|
|||||||
}
|
}
|
||||||
|
|
||||||
address->m_family = GSOCK_INET;
|
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_family = AF_INET;
|
||||||
((struct sockaddr_in *)address->m_addr)->sin_addr.s_addr = INADDR_ANY;
|
((struct sockaddr_in *)address->m_addr)->sin_addr.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
|
@@ -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) { \
|
#define CALL_CALLBACK(socket, event) { \
|
||||||
_GSocket_Disable(socket, event); \
|
_GSocket_Disable(socket, event); \
|
||||||
|
Reference in New Issue
Block a user