+  wxUint32 total = 0;
+  int ret = 1;
+
+  // If the socket is invalid or parameters are ill, return immediately
+  if (!m_socket || !buffer || !nbytes)
+    return 0;
+
+  // Possible combinations (they are checked in this order)
+  // wxSOCKET_NOWAIT
+  // wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK)
+  // wxSOCKET_BLOCK
+  // wxSOCKET_NONE
+  //
+  if (m_flags & wxSOCKET_NOWAIT)
+  {
+    GSocket_SetNonBlocking(m_socket, 1);
+    ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
+    GSocket_SetNonBlocking(m_socket, 0);
+
+    if (ret > 0)
+      total = ret;
+  }
+  else
+  {
+    bool more = TRUE;
+
+    while (more)            
+    {
+      if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() )
+        break;
+
+      ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
+
+      if (ret > 0)
+      {
+        total  += ret;
+        nbytes -= ret;
+        buffer  = (const char *)buffer + ret;
+      }
+
+      // If we got here and wxSOCKET_WAITALL is not set, we can leave
+      // now. Otherwise, wait until we send all the data or until there
+      // is an error.
+      //
+      more = (ret > 0 && nbytes > 0 && (m_flags & wxSOCKET_WAITALL));
+    }
+  }
+
+  return total;
+}
+
+wxSocketBase& wxSocketBase::WriteMsg(const void *buffer, wxUint32 nbytes)
+{
+  wxUint32 total;
+  bool error;
+  int old_flags;
+  struct
+  {
+    unsigned char sig[4];
+    unsigned char len[4];