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:
Vadim Zeitlin
2004-07-25 11:16:31 +00:00
parent fdaebb0520
commit bfa7bf7d6b
6 changed files with 101 additions and 3 deletions

View File

@@ -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):

View File

@@ -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 */

View File

@@ -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; }

View File

@@ -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 )
{ {

View File

@@ -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;

View File

@@ -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); \