]> git.saurik.com Git - wxWidgets.git/commitdiff
basic UDP support (patch 835128)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 25 Jul 2004 11:16:31 +0000 (11:16 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 25 Jul 2004 11:16:31 +0000 (11:16 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28453 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/gsocket.h
include/wx/socket.h
src/common/socket.cpp
src/msw/gsocket.c
src/unix/gsocket.c

index f21eff65f67d27fa4a3dc6a544b461c6bec49d28..49816121ee9d645f00db73dbd546f4df598ba19e 100644 (file)
@@ -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):
 
index 857cc04c53afead0486cf1adc919f9094ba71bb7..9916b9771e4b466ef3a9ae9816072ed2862d9eff 100644 (file)
@@ -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 */
 
index 864ba4f96dd841d15e2d72dbad6f6b61fc3281c8..7b153c09d9af9c1faf15a9eccf6e03d8443717da 100644 (file)
@@ -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; }
index 4f265961933249a0e042ff6d502a94b0766bf758..5e8f4ff8dec23f8d9196be1dd529c7b28ef55a30 100644 (file)
@@ -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 )
   {
index 4d6e01f6245a65492f5cc66a1da02d41e3731229..c4f9345519f1ad96f1df6f76af510ad6dbbdb53d 100644 (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) */
 
 /* _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;
 
index 3f1c19c86284d93295a2f7caf0269f0fcf0571f9..bc68887a40b925aaaeb2e78800ba625b780ca28b 100644 (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) {                                  \
   _GSocket_Disable(socket, event);                                      \