Added support for Windows XP.
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 5376ea1..50aeaee 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -2501,6 +2501,7 @@
 		WORD wVersionRequested;
 		WSADATA wsaData;
 		int err;
+        HMODULE wsdll;
 
 		/* Use the MAKEWORD(lowbyte, highbyte) macro from Windef.h */
 		wVersionRequested = MAKEWORD(2, 2);
@@ -2513,6 +2514,17 @@
 									   err);
 			return NULL;
 		}
+
+        wsdll = GetModuleHandle("Ws2_32.dll");
+        if (wsdll)
+        {
+            poll = (PFNWSAPOLL)GetProcAddress(wsdll, "WSAPoll");
+        }
+
+        if (!poll)
+        {
+            poll = emulated_poll;
+        }
 	}
 #endif
 
diff --git a/win32port/libwebsocketswin32/libwebsocketswin32.vcxproj b/win32port/libwebsocketswin32/libwebsocketswin32.vcxproj
index 14d4b0b..8c371f3 100644
--- a/win32port/libwebsocketswin32/libwebsocketswin32.vcxproj
+++ b/win32port/libwebsocketswin32/libwebsocketswin32.vcxproj
@@ -243,6 +243,7 @@
       <AdditionalDependencies>Ws2_32.lib;..\..\output\ZLib_vc100-mt-s.lib;%(AdditionalDependencies)</AdditionalDependencies>

       <OptimizeReferences>true</OptimizeReferences>

       <EnableCOMDATFolding>true</EnableCOMDATFolding>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

     </Link>

     <ProjectReference />

   </ItemDefinitionGroup>

@@ -257,6 +258,7 @@
     <ClCompile Include="..\..\lib\parsers.c" />

     <ClCompile Include="..\..\lib\sha-1.c" />

     <ClCompile Include="..\win32helpers\gettimeofday.c" />

+    <ClCompile Include="..\win32helpers\websock-w32.c" />

   </ItemGroup>

   <ItemGroup>

     <ClInclude Include="..\..\lib\extension-deflate-stream.h" />

@@ -264,6 +266,7 @@
     <ClInclude Include="..\..\lib\libwebsockets.h" />

     <ClInclude Include="..\..\lib\private-libwebsockets.h" />

     <ClInclude Include="..\win32helpers\gettimeofday.h" />

+    <ClInclude Include="..\win32helpers\websock-w32.h" />

   </ItemGroup>

   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

   <ImportGroup Label="ExtensionTargets">

diff --git a/win32port/libwebsocketswin32/libwebsocketswin32.vcxproj.filters b/win32port/libwebsocketswin32/libwebsocketswin32.vcxproj.filters
index 878f16a..3c6edbb 100644
--- a/win32port/libwebsocketswin32/libwebsocketswin32.vcxproj.filters
+++ b/win32port/libwebsocketswin32/libwebsocketswin32.vcxproj.filters
@@ -45,6 +45,9 @@
     <ClCompile Include="..\win32helpers\gettimeofday.c">

       <Filter>Source Files</Filter>

     </ClCompile>

+    <ClCompile Include="..\win32helpers\websock-w32.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

   </ItemGroup>

   <ItemGroup>

     <ClInclude Include="..\..\lib\libwebsockets.h">

@@ -62,5 +65,8 @@
     <ClInclude Include="..\win32helpers\gettimeofday.h">

       <Filter>Source Files</Filter>

     </ClInclude>

+    <ClInclude Include="..\win32helpers\websock-w32.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

   </ItemGroup>

 </Project>
\ No newline at end of file
diff --git a/win32port/win32helpers/websock-w32.c b/win32port/win32helpers/websock-w32.c
new file mode 100644
index 0000000..b6b339a
--- /dev/null
+++ b/win32port/win32helpers/websock-w32.c
@@ -0,0 +1,156 @@
+#define FD_SETSIZE 256
+
+#include <WinSock2.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "websock-w32.h"
+
+
+PFNWSAPOLL poll = NULL;
+
+
+INT WSAAPI emulated_poll(LPWSAPOLLFD fdarray, ULONG nfds, INT timeout)
+{
+    fd_set readfds, writefds;
+    struct timeval tv, *ptv;
+    SOCKET max_socket;
+    ULONG n;
+    int num_bits, num_sockets_ready;
+
+    if (NULL == fdarray)
+    {
+        errno = EFAULT;
+        return -1;
+    }
+
+    FD_ZERO(&readfds);
+    FD_ZERO(&writefds);
+
+    max_socket = 0;
+    n = 0;
+    while (n < nfds)
+    {
+        WSAPOLLFD * const poll_fd = (fdarray + n);
+        SOCKET sock = poll_fd->fd;
+        poll_fd->revents = 0;
+        if (0 <= sock)
+        {
+            const SHORT events = poll_fd->events;
+            if (events)
+            {
+                if (max_socket < sock)
+                {
+                    max_socket = sock;
+                }
+
+                if (events & POLLIN)
+                {
+                    FD_SET(sock, &readfds);
+                }
+
+                if (events & POLLOUT)
+                {
+                    FD_SET(sock, &writefds);
+                }
+            }
+        }
+        n++;
+    }
+
+    if (0 > timeout)
+    {
+        ptv = NULL;
+    }
+    else
+    {
+        ptv = &tv;
+        if (0 == timeout)
+        {
+            tv.tv_sec = 0;
+            tv.tv_usec = 0;
+        }
+        else if (1000 <= timeout)
+        {
+            tv.tv_sec = (timeout / 1000);
+            tv.tv_usec = ((timeout % 1000) * 1000);
+        }
+        else
+        {
+            tv.tv_sec = 0;
+            tv.tv_usec = (timeout * 1000);
+        }
+    }
+
+    num_bits = select((int)max_socket + 1, &readfds, &writefds, NULL, ptv);
+    if (0 >= num_bits)
+    {
+        return num_bits;
+    }
+
+    num_sockets_ready = 0;
+    n = 0;
+    do
+    {
+        WSAPOLLFD * const poll_fd = (fdarray + n);
+        SOCKET sock = poll_fd->fd;
+        if (0 <= sock)
+        {
+            const SHORT events = poll_fd->events;
+            if (events)
+            {
+                if (FD_ISSET(sock, &readfds))
+                {
+                    const int saved_error = WSAGetLastError();
+                    char test_data[4] = {0};
+                    int ret;
+
+                    /* support for POLLHUP */
+                    ret = recv(poll_fd->fd, test_data, sizeof(test_data), MSG_PEEK);
+                    if (SOCKET_ERROR == ret)
+                    {
+                        const int err = WSAGetLastError();
+                        if (err == WSAESHUTDOWN || err == WSAECONNRESET ||
+                            err == WSAECONNABORTED || err == WSAENETRESET)
+                        {
+                            poll_fd->revents |= POLLHUP;
+                        }
+                    }
+                    else
+                    {
+                        if (events & POLLIN)
+                        {
+                            poll_fd->revents |= POLLIN;
+                        }
+                    }
+
+                    WSASetLastError(saved_error);
+
+                    --num_bits;
+                }
+
+                if (FD_ISSET(sock, &writefds))
+                {
+                    if (events & POLLOUT)
+                    {
+                        poll_fd->revents |= POLLOUT;
+                    }
+
+                    --num_bits;
+                }
+
+                if (poll_fd->revents)
+                {
+                    num_sockets_ready++;
+                }
+            }
+        }
+        else
+        {
+            poll_fd->revents = POLLNVAL;
+        }
+        n++;
+    }
+    while (0 < num_bits && n < nfds);
+
+    return num_sockets_ready;
+}
diff --git a/win32port/win32helpers/websock-w32.h b/win32port/win32helpers/websock-w32.h
index efde5ed..5d64dfd 100644
--- a/win32port/win32helpers/websock-w32.h
+++ b/win32port/win32helpers/websock-w32.h
@@ -18,7 +18,11 @@
 

 #define random rand

 #define usleep _sleep

-#define poll WSAPoll

+

+typedef INT (WSAAPI *PFNWSAPOLL)(LPWSAPOLLFD fdarray, ULONG nfds, INT timeout);

+extern PFNWSAPOLL poll;

+

+extern INT WSAAPI emulated_poll(LPWSAPOLLFD fdarray, ULONG nfds, INT timeout);

 

 /* override configure because we are not using Makefiles */