Changes to make it work and compile on NT, by Mark Hammond.
(NT changes for posixmodule.c re-invented by Guido.)
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 6340fbc..8cacfb2 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -76,15 +76,68 @@
 #include "mytime.h"
 
 #include <signal.h>
+#ifndef NT
 #include <netdb.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#else
+#include <winsock.h>
+#endif
 #ifdef HAVE_SYS_UN_H
 #include <sys/un.h>
 #else
 #undef AF_UNIX
 #endif
 
+/* Here we have some hacks to choose between K&R or ANSI style function
+   definitions.  For NT to build this as an extension module (ie, DLL)
+   it must be compiled by the C++ compiler, as it takes the address of
+   a static data item exported from the main Python DLL.
+*/
+#ifdef NT
+/* seem to be a few differences in the API */
+#define close closesocket
+#define NO_DUP	/* I wont trust passing a socket to NT's RTL!!  */
+#define FORCE_ANSI_FUNC_DEFS
+#endif
+
+#ifdef FORCE_ANSI_FUNC_DEFS
+#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name )	\
+fnname( arg1type arg1name )
+
+#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
+fnname( arg1type arg1name, arg2type arg2name )
+
+#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name )	\
+fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
+
+#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name )	\
+fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
+
+#else /* !FORCE_ANSI_FN_DEFS */
+#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name )	\
+fnname( arg1name )	\
+	arg1type arg1name;
+
+#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
+fnname( arg1name, arg2name )	\
+	arg1type arg1name;	\
+	arg2type arg2name;
+
+#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
+fnname( arg1name, arg2name, arg3name )	\
+	arg1type arg1name;	\
+	arg2type arg2name;	\
+	arg3type arg3name;
+
+#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
+fnname( arg1name, arg2name, arg3name, arg4name )	\
+	arg1type arg1name;	\
+	arg2type arg2name;	\
+	arg3type arg3name;	\
+	arg4type arg4name;
+
+#endif /* !FORCE_ANSI_FN_DEFS */
 
 /* Global variable holding the exception type for errors detected
    by this module (but not argument type or memory errors, etc.). */
@@ -129,8 +182,7 @@
    in NEWOBJ()). */
 
 static sockobject *
-newsockobject(fd, family, type, proto)
-	int fd, family, type, proto;
+BUILD_FUNC_DEF_4(newsockobject, int, fd, int, family, int, type, int, proto)
 {
 	sockobject *s;
 	s = NEWOBJ(sockobject, &Socktype);
@@ -151,9 +203,7 @@
    an error occurred; then an exception is raised. */
 
 static int
-setipaddr(name, addr_ret)
-	char *name;
-	struct sockaddr_in *addr_ret;
+BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
 {
 	struct hostent *hp;
 	int d1, d2, d3, d4;
@@ -192,8 +242,7 @@
    size numbers). */
 
 static object *
-makeipaddr(addr)
-	struct sockaddr_in *addr;
+BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
 {
 	long x = ntohl(addr->sin_addr.s_addr);
 	char buf[100];
@@ -211,9 +260,7 @@
 
 /*ARGSUSED*/
 static object *
-makesockaddr(addr, addrlen)
-	struct sockaddr *addr;
-	int addrlen;
+BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
 {
 	if (addrlen == 0) {
 		/* No address -- may be recvfrom() from known socket */
@@ -256,11 +303,8 @@
    through len_ret. */
 
 static int
-getsockaddrarg(s, args, addr_ret, len_ret)
-	sockobject *s;
-	object *args;
-	struct sockaddr **addr_ret;
-	int *len_ret;
+BUILD_FUNC_DEF_4(
+getsockaddrarg,sockobject *,s, object *,args, struct sockaddr **,addr_ret, int *,len_ret)
 {
 	switch (s->sock_family) {
 
@@ -315,9 +359,7 @@
    through len_ret. */
 
 static int
-getsockaddrlen(s, len_ret)
-	sockobject *s;
-	int *len_ret;
+BUILD_FUNC_DEF_2(getsockaddrlen,sockobject *,s, int *,len_ret)
 {
 	switch (s->sock_family) {
 
@@ -348,9 +390,7 @@
 /* s.accept() method */
 
 static object *
-sock_accept(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_accept,sockobject *,s, object *,args)
 {
 	char addrbuf[256];
 	int addrlen, newfd;
@@ -385,9 +425,7 @@
 /* XXX obsolete -- will disappear in next release */
 
 static object *
-sock_allowbroadcast(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_allowbroadcast,sockobject *,s, object *,args)
 {
 	int flag;
 	int res;
@@ -409,9 +447,7 @@
    use optional built-in module 'struct' to encode the string. */
 
 static object *
-sock_setsockopt(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_setsockopt,sockobject *,s, object *,args)
 {
 	int level;
 	int optname;
@@ -443,9 +479,7 @@
    use optional built-in module 'struct' to decode the string. */
 
 static object *
-sock_getsockopt(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_getsockopt,sockobject *,s, object *,args)
 {
 	int level;
 	int optname;
@@ -487,9 +521,7 @@
 /* s.bind(sockaddr) method */
 
 static object *
-sock_bind(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_bind,sockobject *,s, object *,args)
 {
 	struct sockaddr *addr;
 	int addrlen;
@@ -511,9 +543,7 @@
    will surely fail. */
 
 static object *
-sock_close(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_close,sockobject *,s, object *,args)
 {
 	if (!getnoarg(args))
 		return NULL;
@@ -529,9 +559,7 @@
 /* s.connect(sockaddr) method */
 
 static object *
-sock_connect(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_connect,sockobject *,s, object *,args)
 {
 	struct sockaddr *addr;
 	int addrlen;
@@ -551,9 +579,7 @@
 /* s.fileno() method */
 
 static object *
-sock_fileno(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_fileno,sockobject *,s, object *,args)
 {
 	if (!getnoarg(args))
 		return NULL;
@@ -564,9 +590,7 @@
 /* s.getsockname() method */
 
 static object *
-sock_getsockname(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_getsockname,sockobject *,s, object *,args)
 {
 	char addrbuf[256];
 	int addrlen, res;
@@ -587,9 +611,7 @@
 /* s.getpeername() method */
 
 static object *
-sock_getpeername(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_getpeername,sockobject *,s, object *,args)
 {
 	char addrbuf[256];
 	int addrlen, res;
@@ -610,9 +632,7 @@
 /* s.listen(n) method */
 
 static object *
-sock_listen(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_listen,sockobject *,s, object *,args)
 {
 	int backlog;
 	int res;
@@ -629,7 +649,7 @@
 	return None;
 }
 
-
+#ifndef NO_DUP
 /* s.makefile(mode) method.
    Create a new open file object referring to a dupped version of
    the socket's file descriptor.  (The dup() call is necessary so
@@ -638,9 +658,7 @@
    The mode argument specifies 'r' or 'w' passed to fdopen(). */
 
 static object *
-sock_makefile(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_makefile,sockobject *,s, object *,args)
 {
 	extern int fclose PROTO((FILE *));
 	char *mode;
@@ -653,14 +671,12 @@
 		return socket_error();
 	return newopenfileobject(fp, "<socket>", mode, fclose);
 }
-
+#endif /* NO_DUP */
 
 /* s.recv(nbytes [,flags]) method */
 
 static object *
-sock_recv(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_recv,sockobject *,s, object *,args)
 {
 	int len, n, flags;
 	object *buf;
@@ -687,9 +703,7 @@
 /* s.recvfrom(nbytes [,flags]) method */
 
 static object *
-sock_recvfrom(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_recvfrom,sockobject *,s, object *,args)
 {
 	char addrbuf[256];
 	object *buf, *addr, *ret;
@@ -707,7 +721,11 @@
 		return NULL;
 	BGN_SAVE
 	n = recvfrom(s->sock_fd, getstringvalue(buf), len, flags,
+#ifndef NT
 		     (ANY *)addrbuf, &addrlen);
+#else
+     		     (struct sockaddr *)addrbuf, &addrlen);
+#endif
 	END_SAVE
 	if (n < 0)
 		return socket_error();
@@ -724,9 +742,7 @@
 /* s.send(data [,flags]) method */
 
 static object *
-sock_send(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_send,sockobject *,s, object *,args)
 {
 	char *buf;
 	int len, n, flags;
@@ -748,9 +764,7 @@
 /* s.sendto(data, [flags,] sockaddr) method */
 
 static object *
-sock_sendto(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_sendto,sockobject *,s, object *,args)
 {
 	object *addro;
 	char *buf;
@@ -776,9 +790,7 @@
 /* s.shutdown(how) method */
 
 static object *
-sock_shutdown(s, args)
-	sockobject *s;
-	object *args;
+BUILD_FUNC_DEF_2(sock_shutdown,sockobject *,s, object *,args)
 {
 	int how;
 	int res;
@@ -812,7 +824,9 @@
 	{"getpeername",		(method)sock_getpeername},
 #endif
 	{"listen",		(method)sock_listen},
+#ifndef NO_DUP
 	{"makefile",		(method)sock_makefile},
+#endif
 	{"recv",		(method)sock_recv},
 	{"recvfrom",		(method)sock_recvfrom},
 	{"send",		(method)sock_send},
@@ -826,8 +840,7 @@
    First close the file description. */
 
 static void
-sock_dealloc(s)
-	sockobject *s;
+BUILD_FUNC_DEF_1(sock_dealloc, sockobject *,s)
 {
 	(void) close(s->sock_fd);
 	DEL(s);
@@ -837,9 +850,7 @@
 /* Return a socket object's named attribute. */
 
 static object *
-sock_getattr(s, name)
-	sockobject *s;
-	char *name;
+BUILD_FUNC_DEF_2(sock_getattr,sockobject *,s, char *,name)
 {
 	return findmethod(sock_methods, (object *) s, name);
 }
@@ -869,9 +880,7 @@
 
 /*ARGSUSED*/
 static object *
-socket_gethostname(self, args)
-	object *self;
-	object *args;
+BUILD_FUNC_DEF_2(socket_gethostname,object *,self, object *,args)
 {
 	char buf[1024];
 	int res;
@@ -891,11 +900,9 @@
 
 /*ARGSUSED*/
 static object *
-socket_gethostbyname(self, args)
-	object *self;
-	object *args;
+BUILD_FUNC_DEF_2(socket_gethostbyname,object *,self, object *,args)
 {
-	object *name;
+	char *name;
 	struct sockaddr_in addrbuf;
 	if (!getargs(args, "s", &name))
 		return NULL;
@@ -911,9 +918,7 @@
 
 /*ARGSUSED*/
 static object *
-socket_getservbyname(self, args)
-	object *self;
-	object *args;
+BUILD_FUNC_DEF_2(socket_getservbyname,object *,self, object *,args)
 {
 	char *name, *proto;
 	struct servent *sp;
@@ -936,9 +941,7 @@
 
 /*ARGSUSED*/
 static object *
-socket_socket(self, args)
-	object *self;
-	object *args;
+BUILD_FUNC_DEF_2(socket_socket,object *,self,object *,args)
 {
 	sockobject *s;
 	int fd, family, type, proto;
@@ -960,20 +963,20 @@
 		(void) close(fd);
 	/* From now on, ignore SIGPIPE and let the error checking
 	   do the work. */
+#ifdef SIGPIPE      
 	(void) signal(SIGPIPE, SIG_IGN);
+#endif   
 	return (object *) s;
 }
 
-
+#ifndef NO_DUP
 /* Create a socket object from a numeric file description.
    Useful e.g. if stdin is a socket.
    Additional arguments as for socket(). */
 
 /*ARGSUSED*/
 static object *
-socket_fromfd(self, args)
-	object *self;
-	object *args;
+BUILD_FUNC_DEF_2(socket_fromfd,object *,self,object *,args)
 {
 	sockobject *s;
 	int fd, family, type, proto;
@@ -990,10 +993,12 @@
 	s = newsockobject(fd, family, type, proto);
 	/* From now on, ignore SIGPIPE and let the error checking
 	   do the work. */
+#ifdef SIGPIPE      
 	(void) signal(SIGPIPE, SIG_IGN);
+#endif   
 	return (object *) s;
 }
-
+#endif /* NO_DUP */
 
 /* List of functions exported by this module. */
 
@@ -1002,7 +1007,9 @@
 	{"gethostname",		socket_gethostname},
 	{"getservbyname",	socket_getservbyname},
 	{"socket",		socket_socket},
+#ifndef NO_DUP
 	{"fromfd",		socket_fromfd},
+#endif
 	{NULL,			NULL}		 /* Sentinel */
 };
 
@@ -1011,10 +1018,7 @@
    For simplicity, errors (which are unlikely anyway) are ignored. */
 
 static void
-insint(d, name, value)
-	object *d;
-	char *name;
-	int value;
+BUILD_FUNC_DEF_3(insint,object *,d,char *,name,int,value)
 {
 	object *v = newintobject((long) value);
 	if (v == NULL) {
@@ -1037,7 +1041,6 @@
 initsocket()
 {
 	object *m, *d;
-
 	m = initmodule("socket", socket_methods);
 	d = getmoduledict(m);
 	SocketError = newstringobject("socket.error");
@@ -1053,3 +1056,26 @@
 	insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
 	insint(d, "SOCK_RDM", SOCK_RDM);
 }
+
+#ifdef NT
+BOOL	WINAPI	DllMain (HANDLE hInst, 
+			ULONG ul_reason_for_call,
+			LPVOID lpReserved)
+{
+	switch (ul_reason_for_call)
+	{
+		case DLL_PROCESS_ATTACH:
+			WSADATA WSAData;
+			if (WSAStartup(MAKEWORD(2,0), &WSAData)) {
+				OutputDebugString("Python can't initialize Windows Sockets DLL!");
+				return FALSE;
+			}
+			break;
+		case DLL_PROCESS_DETACH:
+			WSACleanup();
+			break;
+
+	}
+	return TRUE;
+}
+#endif /* NT */