Index: /trunk/src/VBox/Runtime/include/internal/socket.h
===================================================================
--- /trunk/src/VBox/Runtime/include/internal/socket.h	(revision 39800)
+++ /trunk/src/VBox/Runtime/include/internal/socket.h	(revision 39801)
@@ -30,4 +30,5 @@
 #include <iprt/cdefs.h>
 #include <iprt/types.h>
+#include <iprt/net.h>
 /* Currently requires a bunch of socket headers. */
 
@@ -54,8 +55,8 @@
 int rtSocketCreateForNative(RTSOCKETINT **ppSocket, RTSOCKETNATIVE hNative);
 int rtSocketCreate(PRTSOCKET phSocket, int iDomain, int iType, int iProtocol);
-int rtSocketBind(RTSOCKET hSocket, const struct sockaddr *pAddr, int cbAddr);
+int rtSocketBind(RTSOCKET hSocket, PCRTNETADDR pAddr);
 int rtSocketListen(RTSOCKET hSocket, int cMaxPending);
 int rtSocketAccept(RTSOCKET hSocket, PRTSOCKET phClient, struct sockaddr *pAddr, size_t *pcbAddr);
-int rtSocketConnect(RTSOCKET hSocket, const struct sockaddr *pAddr, int cbAddr);
+int rtSocketConnect(RTSOCKET hSocket, PCRTNETADDR pAddr);
 int rtSocketSetOpt(RTSOCKET hSocket, int iLevel, int iOption, void const *pvValue, int cbValue);
 #endif /* IPRT_INTERNAL_SOCKET_POLLING_ONLY */
Index: /trunk/src/VBox/Runtime/r3/posix/process-posix.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/posix/process-posix.cpp	(revision 39800)
+++ /trunk/src/VBox/Runtime/r3/posix/process-posix.cpp	(revision 39801)
@@ -131,4 +131,7 @@
 RTR3DECL(int) RTProcTerminate(RTPROCESS Process)
 {
+    if (Process == NIL_RTPROCESS)
+        return VINF_SUCCESS;
+
     if (!kill(Process, SIGKILL))
         return VINF_SUCCESS;
Index: /trunk/src/VBox/Runtime/r3/socket.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/socket.cpp	(revision 39800)
+++ /trunk/src/VBox/Runtime/r3/socket.cpp	(revision 39801)
@@ -55,4 +55,5 @@
 #include <iprt/asm.h>
 #include <iprt/assert.h>
+#include <iprt/ctype.h>
 #include <iprt/err.h>
 #include <iprt/mempool.h>
@@ -157,7 +158,7 @@
 {
     struct sockaddr     Addr;
-    struct sockaddr_in  Ipv4;
+    struct sockaddr_in  IPv4;
 #ifdef IPRT_WITH_TCPIP_V6
-    struct sockaddr_in6 Ipv6;
+    struct sockaddr_in6 IPv6;
 #endif
 } RTSOCKADDRUNION;
@@ -239,6 +240,6 @@
         RT_ZERO(*pAddr);
         pAddr->enmType      = RTNETADDRTYPE_IPV4;
-        pAddr->uPort        = RT_N2H_U16(pSrc->Ipv4.sin_port);
-        pAddr->uAddr.IPv4.u = pSrc->Ipv4.sin_addr.s_addr;
+        pAddr->uPort        = RT_N2H_U16(pSrc->IPv4.sin_port);
+        pAddr->uAddr.IPv4.u = pSrc->IPv4.sin_addr.s_addr;
     }
 #ifdef IPRT_WITH_TCPIP_V6
@@ -248,9 +249,9 @@
         RT_ZERO(*pAddr);
         pAddr->enmType            = RTNETADDRTYPE_IPV6;
-        pAddr->uPort              = RT_N2H_U16(pSrc->Ipv6.sin6_port);
-        pAddr->uAddr.IPv6.au32[0] = pSrc->Ipv6.sin6_addr.s6_addr32[0];
-        pAddr->uAddr.IPv6.au32[1] = pSrc->Ipv6.sin6_addr.s6_addr32[1];
-        pAddr->uAddr.IPv6.au32[2] = pSrc->Ipv6.sin6_addr.s6_addr32[2];
-        pAddr->uAddr.IPv6.au32[3] = pSrc->Ipv6.sin6_addr.s6_addr32[3];
+        pAddr->uPort              = RT_N2H_U16(pSrc->IPv6.sin6_port);
+        pAddr->uAddr.IPv6.au32[0] = pSrc->IPv6.sin6_addr.s6_addr32[0];
+        pAddr->uAddr.IPv6.au32[1] = pSrc->IPv6.sin6_addr.s6_addr32[1];
+        pAddr->uAddr.IPv6.au32[2] = pSrc->IPv6.sin6_addr.s6_addr32[2];
+        pAddr->uAddr.IPv6.au32[3] = pSrc->IPv6.sin6_addr.s6_addr32[3];
     }
 #endif
@@ -268,6 +269,8 @@
  * @param   pDst                The source address.
  * @param   cbSrc               The size of the source address.
- */
-static int rtSocketAddrFromNetAddr(PCRTNETADDR pAddr, RTSOCKADDRUNION *pDst, size_t cbDst)
+ * @param   pcbAddr             Where to store the size of the returned address.
+ *                              Optional
+ */
+static int rtSocketAddrFromNetAddr(PCRTNETADDR pAddr, RTSOCKADDRUNION *pDst, size_t cbDst, int *pcbAddr)
 {
     RT_BZERO(pDst, cbDst);
@@ -276,6 +279,8 @@
     {
         pDst->Addr.sa_family       = AF_INET;
-        pDst->Ipv4.sin_port        = RT_H2N_U16(pAddr->uPort);
-        pDst->Ipv4.sin_addr.s_addr = pAddr->uAddr.IPv4.u;
+        pDst->IPv4.sin_port        = RT_H2N_U16(pAddr->uPort);
+        pDst->IPv4.sin_addr.s_addr = pAddr->uAddr.IPv4.u;
+        if (pcbAddr)
+            *pcbAddr = sizeof(pDst->IPv4);
     }
 #ifdef IPRT_WITH_TCPIP_V6
@@ -284,9 +289,11 @@
     {
         pDst->Addr.sa_family              = AF_INET6;
-        pDst->Ipv6.sin6_port              = RT_H2N_U16(pAddr->uPort);
-        pSrc->Ipv6.sin6_addr.s6_addr32[0] = pAddr->uAddr.IPv6.au32[0];
-        pSrc->Ipv6.sin6_addr.s6_addr32[1] = pAddr->uAddr.IPv6.au32[1];
-        pSrc->Ipv6.sin6_addr.s6_addr32[2] = pAddr->uAddr.IPv6.au32[2];
-        pSrc->Ipv6.sin6_addr.s6_addr32[3] = pAddr->uAddr.IPv6.au32[3];
+        pDst->IPv6.sin6_port              = RT_H2N_U16(pAddr->uPort);
+        pSrc->IPv6.sin6_addr.s6_addr32[0] = pAddr->uAddr.IPv6.au32[0];
+        pSrc->IPv6.sin6_addr.s6_addr32[1] = pAddr->uAddr.IPv6.au32[1];
+        pSrc->IPv6.sin6_addr.s6_addr32[2] = pAddr->uAddr.IPv6.au32[2];
+        pSrc->IPv6.sin6_addr.s6_addr32[3] = pAddr->uAddr.IPv6.au32[3];
+        if (pcbAddr)
+            *pcbAddr = sizeof(pDst->IPv6);
     }
 #endif
@@ -580,4 +587,31 @@
 }
 
+static bool rtSocketIsIPv4Numerical(const char *pszAddress, PRTNETADDRIPV4 pAddr)
+{
+
+    /* Empty address resolves to the INADDR_ANY address (good for bind). */
+    if (!*pszAddress)
+    {
+        pAddr->u = INADDR_ANY;
+        return true;
+    }
+
+    /* Four quads? */
+    char *psz = (char *)pszAddress;
+    for (int i = 0; i < 4; i++)
+    {
+        uint8_t u8;
+        int rc = RTStrToUInt8Ex(psz, &psz, 0, &u8);
+        if (rc != VINF_SUCCESS)
+            return false;
+        if (*psz != (i < 3 ? '.' : '\0'))
+            return false;
+        psz++;
+
+        pAddr->au8[i] = u8;             /* big endian */
+    }
+
+    return true;
+}
 
 RTDECL(int) RTSocketParseInetAddress(const char *pszAddress, unsigned uPort, PRTNETADDR pAddr)
@@ -606,21 +640,27 @@
 
     /*
-     * Resolve the address.
+     * Resolve the address. Pretty crude at the moment, but we have to make
+     * sure to not ask the NT 4 gethostbyname about an IPv4 address as it may
+     * give a wrong answer.
      */
     /** @todo this only supports IPv4, and IPv6 support needs to be added.
-     * It probably needs to be converted to getnameinfo(). */
-    struct hostent *pHostEnt = NULL;
+     * It probably needs to be converted to getaddrinfo(). */
+    RTNETADDRIPV4 IPv4Quad;
+    if (rtSocketIsIPv4Numerical(pszAddress, &IPv4Quad))
+    {
+        RT_ZERO(*pAddr);
+        pAddr->enmType      = RTNETADDRTYPE_IPV4;
+        pAddr->uPort        = uPort;
+        pAddr->uAddr.IPv4   = IPv4Quad;
+        return VINF_SUCCESS;
+    }
+
+    struct hostent *pHostEnt;
     pHostEnt = gethostbyname(pszAddress);
     if (!pHostEnt)
     {
-        struct in_addr InAddr;
-        InAddr.s_addr = inet_addr(pszAddress);
-        pHostEnt = gethostbyaddr((char *)&InAddr, 4, AF_INET);
-        if (!pHostEnt)
-        {
-            rc = rtSocketResolverError();
-            AssertMsgFailed(("Could not resolve '%s', rc=%Rrc\n", pszAddress, rc));
-            return rc;
-        }
+        rc = rtSocketResolverError();
+        AssertMsgFailed(("Could not resolve '%s', rc=%Rrc\n", pszAddress, rc));
+        return rc;
     }
 
@@ -857,5 +897,5 @@
     if (pAddr)
     {
-        rc = rtSocketAddrFromNetAddr(pAddr, &u, sizeof(u));
+        rc = rtSocketAddrFromNetAddr(pAddr, &u, sizeof(u), NULL);
         if (RT_FAILURE(rc))
             return rc;
@@ -1393,9 +1433,7 @@
  * @returns IPRT status code.
  * @param   hSocket             The socket handle.
- * @param   pAddr               The socket address to bind to.
- * @param   cbAddr              The size of the address structure @a pAddr
- *                              points to.
- */
-int rtSocketBind(RTSOCKET hSocket, const struct sockaddr *pAddr, int cbAddr)
+ * @param   pAddr               The address to bind to.
+ */
+int rtSocketBind(RTSOCKET hSocket, PCRTNETADDR pAddr)
 {
     /*
@@ -1407,7 +1445,12 @@
     AssertReturn(rtSocketTryLock(pThis), VERR_CONCURRENT_ACCESS);
 
-    int rc = VINF_SUCCESS;
-    if (bind(pThis->hNative, pAddr, cbAddr) != 0)
-        rc = rtSocketError();
+    RTSOCKADDRUNION u;
+    int             cbAddr;
+    int rc = rtSocketAddrFromNetAddr(pAddr, &u, sizeof(u), &cbAddr);
+    if (RT_SUCCESS(rc))
+    {
+        if (bind(pThis->hNative, &u.Addr, cbAddr) != 0)
+            rc = rtSocketError();
+    }
 
     rtSocketUnlock(pThis);
@@ -1508,8 +1551,6 @@
  * @param   hSocket             The socket handle.
  * @param   pAddr               The socket address to connect to.
- * @param   cbAddr              The size of the address structure @a pAddr
- *                              points to.
- */
-int rtSocketConnect(RTSOCKET hSocket, const struct sockaddr *pAddr, int cbAddr)
+ */
+int rtSocketConnect(RTSOCKET hSocket, PCRTNETADDR pAddr)
 {
     /*
@@ -1521,7 +1562,13 @@
     AssertReturn(rtSocketTryLock(pThis), VERR_CONCURRENT_ACCESS);
 
-    int rc = VINF_SUCCESS;
-    if (connect(pThis->hNative, pAddr, cbAddr) != 0)
-        rc = rtSocketError();
+    RTSOCKADDRUNION u;
+    int             cbAddr;
+    int rc = rtSocketAddrFromNetAddr(pAddr, &u, sizeof(u), &cbAddr);
+    if (RT_SUCCESS(rc))
+    {
+Log(("Calling connect()...\n%.*Rhxs\n", cbAddr, &u));
+        if (connect(pThis->hNative, &u.Addr, cbAddr) != 0)
+            rc = rtSocketError();
+    }
 
     rtSocketUnlock(pThis);
Index: /trunk/src/VBox/Runtime/r3/tcp.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/tcp.cpp	(revision 39800)
+++ /trunk/src/VBox/Runtime/r3/tcp.cpp	(revision 39801)
@@ -51,4 +51,5 @@
 #include <iprt/assert.h>
 #include <iprt/err.h>
+#include <iprt/log.h>
 #include <iprt/mempool.h>
 #include <iprt/mem.h>
@@ -303,6 +304,4 @@
 RTR3DECL(int) RTTcpServerCreateEx(const char *pszAddress, uint32_t uPort, PPRTTCPSERVER ppServer)
 {
-    int rc;
-
     /*
      * Validate input.
@@ -311,37 +310,11 @@
     AssertPtrReturn(ppServer, VERR_INVALID_PARAMETER);
 
-#ifdef RT_OS_WINDOWS
-    /*
-     * Initialize WinSock and check version.
-     */
-    WORD    wVersionRequested = MAKEWORD(1, 1);
-    WSADATA wsaData;
-    rc = WSAStartup(wVersionRequested, &wsaData);
-    if (wsaData.wVersion != wVersionRequested)
-    {
-        AssertMsgFailed(("Wrong winsock version\n"));
-        return VERR_NOT_SUPPORTED;
-    }
-#endif
-
-    /*
-     * Get host listening address.
-     */
-    struct hostent *pHostEnt = NULL;
-    if (pszAddress != NULL && *pszAddress)
-    {
-        pHostEnt = gethostbyname(pszAddress);
-        if (!pHostEnt)
-        {
-            struct in_addr InAddr;
-            InAddr.s_addr = inet_addr(pszAddress);
-            pHostEnt = gethostbyaddr((char *)&InAddr, 4, AF_INET);
-            if (!pHostEnt)
-            {
-                rc = rtSocketResolverError();
-                return rc;
-            }
-        }
-    }
+    /*
+     * Resolve the address.
+     */
+    RTNETADDR LocalAddr;
+    int rc = RTSocketParseInetAddress(pszAddress, uPort, &LocalAddr);
+    if (RT_FAILURE(rc))
+        return rc;
 
     /*
@@ -360,21 +333,9 @@
         if (!rtSocketSetOpt(WaitSock, SOL_SOCKET, SO_REUSEADDR, &fFlag, sizeof(fFlag)))
         {
-            /*
-             * Set socket family, address and port.
-             */
-            struct sockaddr_in LocalAddr;
-            RT_ZERO(LocalAddr);
-            LocalAddr.sin_family = AF_INET;
-            LocalAddr.sin_port = htons(uPort);
-            /* if address not specified, use INADDR_ANY. */
-            if (!pHostEnt)
-                LocalAddr.sin_addr.s_addr = INADDR_ANY;
-            else
-                LocalAddr.sin_addr = *((struct in_addr *)pHostEnt->h_addr);
 
             /*
              * Bind a name to a socket and set it listening for connections.
              */
-            rc = rtSocketBind(WaitSock, (struct sockaddr *)&LocalAddr, sizeof(LocalAddr));
+            rc = rtSocketBind(WaitSock, &LocalAddr);
             if (RT_SUCCESS(rc))
                 rc = rtSocketListen(WaitSock, RTTCP_SERVER_BACKLOG);
@@ -845,6 +806,4 @@
 RTR3DECL(int) RTTcpClientConnect(const char *pszAddress, uint32_t uPort, PRTSOCKET pSock)
 {
-    int rc;
-
     /*
      * Validate input.
@@ -853,35 +812,11 @@
     AssertPtrReturn(pszAddress, VERR_INVALID_POINTER);
 
-#ifdef RT_OS_WINDOWS
-    /*
-     * Initialize WinSock and check version.
-     */
-    WORD    wVersionRequested = MAKEWORD(1, 1);
-    WSADATA wsaData;
-    rc = WSAStartup(wVersionRequested, &wsaData);
-    if (wsaData.wVersion != wVersionRequested)
-    {
-        AssertMsgFailed(("Wrong winsock version\n"));
-        return VERR_NOT_SUPPORTED;
-    }
-#endif
-
     /*
      * Resolve the address.
      */
-    struct hostent *pHostEnt = NULL;
-    pHostEnt = gethostbyname(pszAddress);
-    if (!pHostEnt)
-    {
-        struct in_addr InAddr;
-        InAddr.s_addr = inet_addr(pszAddress);
-        pHostEnt = gethostbyaddr((char *)&InAddr, 4, AF_INET);
-        if (!pHostEnt)
-        {
-            rc = rtSocketResolverError();
-            AssertMsgFailed(("Could not resolve '%s', rc=%Rrc\n", pszAddress, rc));
-            return rc;
-        }
-    }
+    RTNETADDR Addr;
+    int rc = RTSocketParseInetAddress(pszAddress, uPort, &Addr);
+    if (RT_FAILURE(rc))
+        return rc;
 
     /*
@@ -889,4 +824,5 @@
      */
     RTSOCKET Sock;
+Log(("Calling rtSocketCreate\n"));
     rc = rtSocketCreate(&Sock, PF_INET, SOCK_STREAM, 0);
     if (RT_SUCCESS(rc))
@@ -894,10 +830,7 @@
         RTSocketSetInheritance(Sock, false /*fInheritable*/);
 
-        struct sockaddr_in InAddr;
-        RT_ZERO(InAddr);
-        InAddr.sin_family = AF_INET;
-        InAddr.sin_port = htons(uPort);
-        InAddr.sin_addr = *((struct in_addr *)pHostEnt->h_addr);
-        rc = rtSocketConnect(Sock, (struct sockaddr *)&InAddr, sizeof(InAddr));
+Log(("Calling rtSocketConnect\n"));
+        rc = rtSocketConnect(Sock, &Addr);
+Log(("rtSocketConnect returned\n"));
         if (RT_SUCCESS(rc))
         {
Index: /trunk/src/VBox/Runtime/r3/udp.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/udp.cpp	(revision 39800)
+++ /trunk/src/VBox/Runtime/r3/udp.cpp	(revision 39801)
@@ -274,5 +274,4 @@
 RTR3DECL(int) RTUdpServerCreateEx(const char *pszAddress, uint32_t uPort, PPRTUDPSERVER ppServer)
 {
-    int rc;
 
     /*
@@ -282,37 +281,11 @@
     AssertPtrReturn(ppServer, VERR_INVALID_PARAMETER);
 
-#ifdef RT_OS_WINDOWS
-    /*
-     * Initialize WinSock and check version.
-     */
-    WORD    wVersionRequested = MAKEWORD(1, 1);
-    WSADATA wsaData;
-    rc = WSAStartup(wVersionRequested, &wsaData);
-    if (wsaData.wVersion != wVersionRequested)
-    {
-        AssertMsgFailed(("Wrong winsock version\n"));
-        return VERR_NOT_SUPPORTED;
-    }
-#endif
-
-    /*
-     * Get host listening address.
-     */
-    struct hostent *pHostEnt = NULL;
-    if (pszAddress != NULL && *pszAddress)
-    {
-        pHostEnt = gethostbyname(pszAddress);
-        if (!pHostEnt)
-        {
-            struct in_addr InAddr;
-            InAddr.s_addr = inet_addr(pszAddress);
-            pHostEnt = gethostbyaddr((char *)&InAddr, 4, AF_INET);
-            if (!pHostEnt)
-            {
-                rc = rtSocketResolverError();
-                return rc;
-            }
-        }
-    }
+    /*
+     * Resolve the address.
+     */
+    RTNETADDR LocalAddr;
+    int rc = RTSocketParseInetAddress(pszAddress, uPort, &LocalAddr);
+    if (RT_FAILURE(rc))
+        return rc;
 
     /*
@@ -332,20 +305,7 @@
         {
             /*
-             * Set socket family, address and port.
-             */
-            struct sockaddr_in LocalAddr;
-            RT_ZERO(LocalAddr);
-            LocalAddr.sin_family = AF_INET;
-            LocalAddr.sin_port = htons(uPort);
-            /* if address not specified, use INADDR_ANY. */
-            if (!pHostEnt)
-                LocalAddr.sin_addr.s_addr = INADDR_ANY;
-            else
-                LocalAddr.sin_addr = *((struct in_addr *)pHostEnt->h_addr);
-
-            /*
              * Bind a name to the socket.
              */
-            rc = rtSocketBind(Sock, (struct sockaddr *)&LocalAddr, sizeof(LocalAddr));
+            rc = rtSocketBind(Sock, &LocalAddr);
             if (RT_SUCCESS(rc))
             {
Index: /trunk/src/VBox/Runtime/r3/win/process-win.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/win/process-win.cpp	(revision 39800)
+++ /trunk/src/VBox/Runtime/r3/win/process-win.cpp	(revision 39801)
@@ -1276,4 +1276,7 @@
 RTR3DECL(int) RTProcTerminate(RTPROCESS Process)
 {
+    if (Process == NIL_RTPROCESS)
+        return VINF_SUCCESS;
+
     int rc = RTOnce(&g_rtProcWinInitOnce, rtProcWinInitOnce, NULL, NULL);
     AssertRCReturn(rc, rc);
Index: /trunk/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
===================================================================
--- /trunk/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp	(revision 39800)
+++ /trunk/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp	(revision 39801)
@@ -392,8 +392,16 @@
         //case WSANOTINITIALISED       (WSABASEERR+93)
 
-        //case WSAHOST_NOT_FOUND       (WSABASEERR+1001)
-        //case WSATRY_AGAIN            (WSABASEERR+1002)
-        //case WSANO_RECOVERY          (WSABASEERR+1003)
-        //case WSANO_DATA              (WSABASEERR+1004)
+#ifdef WSAHOST_NOT_FOUND
+        case WSAHOST_NOT_FOUND:     return VERR_NET_HOST_NOT_FOUND;
+#endif
+#ifdef WSATRY_AGAIN
+        case WSATRY_AGAIN:          return VERR_TRY_AGAIN;
+#endif
+#ifndef WSANO_RECOVERY
+        case WSANO_RECOVERY:        return VERR_IO_GEN_FAILURE;
+#endif
+#ifdef WSANO_DATA
+        case WSANO_DATA:            return VERR_NET_ADDRESS_NOT_AVAILABLE;
+#endif
 
 
