1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI not be used in advertising or publicity pertaining to
13 distribution of the software without specific, written prior permission.
15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 ******************************************************************/
28 This module provides an interface to Berkeley socket IPC.
32 - only AF_INET and AF_UNIX address families are supported
33 - no read/write operations (use send/recv or makefile instead)
37 - socket.error: exception raised for socket specific errors
38 - socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
39 - socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
40 - socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
41 - socket.getservbyname(servicename, protocolname) --> port number
42 - socket.socket(family, type [, proto]) --> new socket object
43 - socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
44 - an Internet socket address is a pair (hostname, port)
45 where hostname can be anything recognized by gethostbyname()
46 (including the dd.dd.dd.dd notation) and port is in host byte order
47 - where a hostname is returned, the dd.dd.dd.dd notation is used
48 - a UNIX domain socket address is a string specifying the pathname
52 - s.accept() --> new socket object, sockaddr
53 - s.bind(sockaddr) --> None
55 - s.connect(sockaddr) --> None
56 - s.fileno() --> file descriptor
57 - s.getpeername() --> sockaddr
58 - s.getsockname() --> sockaddr
59 - s.getsockopt(level, optname[, buflen]) --> int or string
60 - s.listen(backlog) --> None
61 - s.makefile([mode[, bufsize]]) --> file object
62 - s.recv(buflen [,flags]) --> string
63 - s.recvfrom(buflen [,flags]) --> string, sockaddr
64 - s.send(string [,flags]) --> nbytes
65 - s.sendto(string, [flags,] sockaddr) --> nbytes
66 - s.setblocking(0 | 1) --> None
67 - s.setsockopt(level, optname, value) --> None
68 - s.shutdown(how) --> None
69 - repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
75 #include <sys/types.h>
81 #include <sys/socket.h>
82 #include <netinet/in.h>
95 #define O_NDELAY O_NONBLOCK /* For QNX only? */
99 /* fdopen() isn't declared in stdio.h (sigh) */
104 /* Here we have some hacks to choose between K&R or ANSI style function
105 definitions. For NT to build this as an extension module (ie, DLL)
106 it must be compiled by the C++ compiler, as it takes the address of
107 a static data item exported from the main Python DLL.
110 /* seem to be a few differences in the API */
111 #define close closesocket
112 #define NO_DUP /* Define for NT 3.1, Win3.1 and Win95, Undefine for NT3.5 */
113 #define FORCE_ANSI_FUNC_DEFS
116 #ifdef FORCE_ANSI_FUNC_DEFS
117 #define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
118 fnname( arg1type arg1name )
120 #define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
121 fnname( arg1type arg1name, arg2type arg2name )
123 #define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
124 fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
126 #define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
127 fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
129 #else /* !FORCE_ANSI_FN_DEFS */
130 #define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
134 #define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
135 fnname( arg1name, arg2name ) \
139 #define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
140 fnname( arg1name, arg2name, arg3name ) \
145 #define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
146 fnname( arg1name, arg2name, arg3name, arg4name ) \
152 #endif /* !FORCE_ANSI_FN_DEFS */
154 /* Global variable holding the exception type for errors detected
155 by this module (but not argument type or memory errors, etc.). */
157 static PyObject
*PySocket_Error
;
160 /* Convenience function to raise an error according to errno
161 and return a NULL pointer from a function. */
167 if (WSAGetLastError()) {
169 v
= Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
171 PyErr_SetObject(PySocket_Error
, v
);
178 return PyErr_SetFromErrno(PySocket_Error
);
182 /* The object holding a socket. It holds some extra information,
183 like the address family, which is used to decode socket address
184 arguments properly. */
188 int sock_fd
; /* Socket file descriptor */
189 int sock_family
; /* Address family, e.g., AF_INET */
190 int sock_type
; /* Socket type, e.g., SOCK_STREAM */
191 int sock_proto
; /* Protocol type, usually 0 */
193 struct sockaddr_in in
;
195 struct sockaddr_un un
;
198 } PySocketSockObject
;
201 /* A forward reference to the Socktype type object.
202 The Socktype variable contains pointers to various functions,
203 some of which call newsockobject(), which uses Socktype, so
204 there has to be a circular reference. */
206 staticforward PyTypeObject PySocketSock_Type
;
209 /* Create a new socket object.
210 This just creates the object and initializes it.
211 If the creation fails, return NULL and set an exception (implicit
214 static PySocketSockObject
*
215 BUILD_FUNC_DEF_4(PySocketSock_New
,int,fd
, int,family
, int,type
, int,proto
)
217 PySocketSockObject
*s
;
218 PySocketSock_Type
.ob_type
= &PyType_Type
;
219 s
= PyObject_NEW(PySocketSockObject
, &PySocketSock_Type
);
222 s
->sock_family
= family
;
224 s
->sock_proto
= proto
;
230 /* Convert a string specifying a host name or one of a few symbolic
231 names to a numeric IP address. This usually calls gethostbyname()
232 to do the work; the names "" and "<broadcast>" are special.
233 Return the length (should always be 4 bytes), or negative if
234 an error occurred; then an exception is raised. */
237 BUILD_FUNC_DEF_2(setipaddr
, char*,name
, struct sockaddr_in
*,addr_ret
)
242 #ifdef HAVE_GETHOSTBYNAME_R
243 struct hostent hp_allocated
;
245 int buf_len
= (sizeof buf
) - 1;
247 #endif /* HAVE_GETHOSTBYNAME_R */
249 if (name
[0] == '\0') {
250 addr_ret
->sin_addr
.s_addr
= INADDR_ANY
;
253 if (name
[0] == '<' && strcmp(name
, "<broadcast>") == 0) {
254 addr_ret
->sin_addr
.s_addr
= INADDR_BROADCAST
;
257 if (sscanf(name
, "%d.%d.%d.%d%c", &d1
, &d2
, &d3
, &d4
, &ch
) == 4 &&
258 0 <= d1
&& d1
<= 255 && 0 <= d2
&& d2
<= 255 &&
259 0 <= d3
&& d3
<= 255 && 0 <= d4
&& d4
<= 255) {
260 addr_ret
->sin_addr
.s_addr
= htonl(
261 ((long) d1
<< 24) | ((long) d2
<< 16) |
262 ((long) d3
<< 8) | ((long) d4
<< 0));
265 #ifdef HAVE_GETHOSTBYNAME_R
266 Py_BEGIN_ALLOW_THREADS
267 hp
= gethostbyname_r(name
, &hp_allocated
, buf
, buf_len
, &errnop
);
269 #else /* not HAVE_GETHOSTBYNAME_R */
270 hp
= gethostbyname(name
);
271 #endif /* HAVE_GETHOSTBYNAME_R */
274 #ifdef HAVE_HSTRERROR
275 /* Let's get real error message to return */
277 PyErr_SetString(PySocket_Error
, (char *)hstrerror(h_errno
));
279 PyErr_SetString(PySocket_Error
, "host not found");
283 memcpy((char *) &addr_ret
->sin_addr
, hp
->h_addr
, hp
->h_length
);
288 /* Create a string object representing an IP address.
289 This is always a string of the form 'dd.dd.dd.dd' (with variable
293 BUILD_FUNC_DEF_1(makeipaddr
, struct sockaddr_in
*,addr
)
295 long x
= ntohl(addr
->sin_addr
.s_addr
);
297 sprintf(buf
, "%d.%d.%d.%d",
298 (int) (x
>>24) & 0xff, (int) (x
>>16) & 0xff,
299 (int) (x
>> 8) & 0xff, (int) (x
>> 0) & 0xff);
300 return PyString_FromString(buf
);
304 /* Create an object representing the given socket address,
305 suitable for passing it back to bind(), connect() etc.
306 The family field of the sockaddr structure is inspected
307 to determine what kind of address it really is. */
311 BUILD_FUNC_DEF_2(makesockaddr
,struct sockaddr
*,addr
, int,addrlen
)
314 /* No address -- may be recvfrom() from known socket */
319 switch (addr
->sa_family
) {
323 struct sockaddr_in
*a
= (struct sockaddr_in
*) addr
;
324 PyObject
*addr
= makeipaddr(a
);
325 PyObject
*ret
= Py_BuildValue("Oi", addr
, ntohs(a
->sin_port
));
333 struct sockaddr_un
*a
= (struct sockaddr_un
*) addr
;
334 return PyString_FromString(a
->sun_path
);
338 /* More cases here... */
341 PyErr_SetString(PySocket_Error
, "return unknown socket address type");
348 /* Parse a socket address argument according to the socket object's
349 address family. Return 1 if the address was in the proper format,
350 0 of not. The address is returned through addr_ret, its length
355 getsockaddrarg
,PySocketSockObject
*,s
, PyObject
*,args
, struct sockaddr
**,addr_ret
, int *,len_ret
)
357 switch (s
->sock_family
) {
362 struct sockaddr_un
* addr
;
365 addr
= (struct sockaddr_un
* )&(s
->sock_addr
).un
;
366 if (!PyArg_Parse(args
, "s#", &path
, &len
))
368 if (len
> sizeof addr
->sun_path
) {
369 PyErr_SetString(PySocket_Error
, "AF_UNIX path too long");
372 addr
->sun_family
= AF_UNIX
;
373 memcpy(addr
->sun_path
, path
, len
);
374 addr
->sun_path
[len
] = 0;
375 *addr_ret
= (struct sockaddr
*) addr
;
376 *len_ret
= len
+ sizeof addr
->sun_family
;
383 struct sockaddr_in
* addr
;
386 addr
=(struct sockaddr_in
*)&(s
->sock_addr
).in
;
387 if (!PyArg_Parse(args
, "(si)", &host
, &port
))
389 if (setipaddr(host
, addr
) < 0)
391 addr
->sin_family
= AF_INET
;
392 addr
->sin_port
= htons(port
);
393 *addr_ret
= (struct sockaddr
*) addr
;
394 *len_ret
= sizeof *addr
;
398 /* More cases here... */
401 PyErr_SetString(PySocket_Error
, "getsockaddrarg: bad family");
408 /* Get the address length according to the socket object's address family.
409 Return 1 if the family is known, 0 otherwise. The length is returned
413 BUILD_FUNC_DEF_2(getsockaddrlen
,PySocketSockObject
*,s
, int *,len_ret
)
415 switch (s
->sock_family
) {
420 *len_ret
= sizeof (struct sockaddr_un
);
427 *len_ret
= sizeof (struct sockaddr_in
);
431 /* More cases here... */
434 PyErr_SetString(PySocket_Error
, "getsockaddrarg: bad family");
441 /* s.accept() method */
444 BUILD_FUNC_DEF_2(PySocketSock_accept
,PySocketSockObject
*,s
, PyObject
*,args
)
448 PyObject
*sock
, *addr
, *res
;
449 if (!PyArg_NoArgs(args
))
451 if (!getsockaddrlen(s
, &addrlen
))
453 Py_BEGIN_ALLOW_THREADS
454 newfd
= accept(s
->sock_fd
, (struct sockaddr
*) addrbuf
, &addrlen
);
457 return PySocket_Err();
458 /* Create the new object with unspecified family,
459 to avoid calls to bind() etc. on it. */
460 sock
= (PyObject
*) PySocketSock_New(newfd
,
466 addr
= makesockaddr((struct sockaddr
*) addrbuf
, addrlen
);
467 res
= Py_BuildValue("OO", sock
, addr
);
475 /* s.allowbroadcast() method */
476 /* XXX obsolete -- will disappear in next release */
479 BUILD_FUNC_DEF_2(PySocketSock_allowbroadcast
,PySocketSockObject
*,s
, PyObject
*,args
)
483 if (!PyArg_Parse(args
, "i", &flag
))
485 res
= setsockopt(s
->sock_fd
, SOL_SOCKET
, SO_BROADCAST
,
486 (ANY
*)&flag
, sizeof flag
);
488 return PySocket_Err();
495 /* s.setblocking(1 | 0) method */
498 BUILD_FUNC_DEF_2(PySocketSock_setblocking
,PySocketSockObject
*,s
,PyObject
*,args
)
502 if (!PyArg_GetInt(args
, &block
))
504 Py_BEGIN_ALLOW_THREADS
506 delay_flag
= fcntl (s
->sock_fd
, F_GETFL
, 0);
508 delay_flag
&= (~O_NDELAY
);
510 delay_flag
|= O_NDELAY
;
511 fcntl (s
->sock_fd
, F_SETFL
, delay_flag
);
514 ioctlsocket(s
->sock_fd
, FIONBIO
, (u_long
*)&block
);
523 /* s.setsockopt() method.
524 With an integer third argument, sets an integer option.
525 With a string third argument, sets an option from a buffer;
526 use optional built-in module 'struct' to encode the string. */
529 BUILD_FUNC_DEF_2(PySocketSock_setsockopt
,PySocketSockObject
*,s
, PyObject
*,args
)
538 if (PyArg_Parse(args
, "(iii)", &level
, &optname
, &flag
)) {
539 buf
= (char *) &flag
;
540 buflen
= sizeof flag
;
544 if (!PyArg_Parse(args
, "(iis#)", &level
, &optname
, &buf
, &buflen
))
547 res
= setsockopt(s
->sock_fd
, level
, optname
, (ANY
*)buf
, buflen
);
549 return PySocket_Err();
555 /* s.getsockopt() method.
556 With two arguments, retrieves an integer option.
557 With a third integer argument, retrieves a string buffer of that size;
558 use optional built-in module 'struct' to decode the string. */
561 BUILD_FUNC_DEF_2(PySocketSock_getsockopt
,PySocketSockObject
*,s
, PyObject
*,args
)
569 if (PyArg_Parse(args
, "(ii)", &level
, &optname
)) {
571 int flagsize
= sizeof flag
;
572 res
= getsockopt(s
->sock_fd
, level
, optname
,
573 (ANY
*)&flag
, &flagsize
);
575 return PySocket_Err();
576 return PyInt_FromLong(flag
);
579 if (!PyArg_Parse(args
, "(iii)", &level
, &optname
, &buflen
))
581 if (buflen
<= 0 || buflen
> 1024) {
582 PyErr_SetString(PySocket_Error
, "getsockopt buflen out of range");
585 buf
= PyString_FromStringAndSize((char *)NULL
, buflen
);
588 res
= getsockopt(s
->sock_fd
, level
, optname
,
589 (ANY
*)PyString_AsString(buf
), &buflen
);
592 return PySocket_Err();
594 _PyString_Resize(&buf
, buflen
);
599 /* s.bind(sockaddr) method */
602 BUILD_FUNC_DEF_2(PySocketSock_bind
,PySocketSockObject
*,s
, PyObject
*,args
)
604 struct sockaddr
*addr
;
607 if (!getsockaddrarg(s
, args
, &addr
, &addrlen
))
609 Py_BEGIN_ALLOW_THREADS
610 res
= bind(s
->sock_fd
, addr
, addrlen
);
613 return PySocket_Err();
620 Set the file descriptor to -1 so operations tried subsequently
624 BUILD_FUNC_DEF_2(PySocketSock_close
,PySocketSockObject
*,s
, PyObject
*,args
)
626 if (!PyArg_NoArgs(args
))
628 Py_BEGIN_ALLOW_THREADS
629 (void) close(s
->sock_fd
);
637 /* s.connect(sockaddr) method */
640 BUILD_FUNC_DEF_2(PySocketSock_connect
,PySocketSockObject
*,s
, PyObject
*,args
)
642 struct sockaddr
*addr
;
645 if (!getsockaddrarg(s
, args
, &addr
, &addrlen
))
647 Py_BEGIN_ALLOW_THREADS
648 res
= connect(s
->sock_fd
, addr
, addrlen
);
651 return PySocket_Err();
657 /* s.fileno() method */
660 BUILD_FUNC_DEF_2(PySocketSock_fileno
,PySocketSockObject
*,s
, PyObject
*,args
)
662 if (!PyArg_NoArgs(args
))
664 return PyInt_FromLong((long) s
->sock_fd
);
668 /* s.getsockname() method */
671 BUILD_FUNC_DEF_2(PySocketSock_getsockname
,PySocketSockObject
*,s
, PyObject
*,args
)
675 if (!PyArg_NoArgs(args
))
677 if (!getsockaddrlen(s
, &addrlen
))
679 memset(addrbuf
, 0, addrlen
);
680 Py_BEGIN_ALLOW_THREADS
681 res
= getsockname(s
->sock_fd
, (struct sockaddr
*) addrbuf
, &addrlen
);
684 return PySocket_Err();
685 return makesockaddr((struct sockaddr
*) addrbuf
, addrlen
);
689 #ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
690 /* s.getpeername() method */
693 BUILD_FUNC_DEF_2(PySocketSock_getpeername
,PySocketSockObject
*,s
, PyObject
*,args
)
697 if (!PyArg_NoArgs(args
))
699 if (!getsockaddrlen(s
, &addrlen
))
701 Py_BEGIN_ALLOW_THREADS
702 res
= getpeername(s
->sock_fd
, (struct sockaddr
*) addrbuf
, &addrlen
);
705 return PySocket_Err();
706 return makesockaddr((struct sockaddr
*) addrbuf
, addrlen
);
708 #endif /* HAVE_GETPEERNAME */
711 /* s.listen(n) method */
714 BUILD_FUNC_DEF_2(PySocketSock_listen
,PySocketSockObject
*,s
, PyObject
*,args
)
718 if (!PyArg_GetInt(args
, &backlog
))
720 Py_BEGIN_ALLOW_THREADS
723 res
= listen(s
->sock_fd
, backlog
);
726 return PySocket_Err();
732 /* s.makefile(mode) method.
733 Create a new open file object referring to a dupped version of
734 the socket's file descriptor. (The dup() call is necessary so
735 that the open file and socket objects may be closed independent
737 The mode argument specifies 'r' or 'w' passed to fdopen(). */
740 BUILD_FUNC_DEF_2(PySocketSock_makefile
,PySocketSockObject
*,s
, PyObject
*,args
)
742 extern int fclose
Py_PROTO((FILE *));
749 if (!PyArg_ParseTuple(args
, "|si", &mode
, &bufsize
))
752 if ( ((fd
= _open_osfhandle( s
->sock_fd
, _O_BINARY
)) < 0) ||
753 ((fd
= dup(fd
)) < 0) || ((fp
= fdopen(fd
, mode
)) == NULL
)) {
755 if ((fd
= dup(s
->sock_fd
)) < 0 ||
756 (fp
= fdopen(fd
, mode
)) == NULL
) {
760 return PySocket_Err();
762 f
= PyFile_FromFile(fp
, "<socket>", mode
, fclose
);
764 PyFile_SetBufSize(f
, bufsize
);
769 /* s.recv(nbytes [,flags]) method */
772 BUILD_FUNC_DEF_2(PySocketSock_recv
,PySocketSockObject
*,s
, PyObject
*,args
)
777 if (!PyArg_Parse(args
, "i", &len
)) {
779 if (!PyArg_Parse(args
, "(ii)", &len
, &flags
))
782 buf
= PyString_FromStringAndSize((char *) 0, len
);
785 Py_BEGIN_ALLOW_THREADS
786 n
= recv(s
->sock_fd
, PyString_AsString(buf
), len
, flags
);
790 return PySocket_Err();
792 if (_PyString_Resize(&buf
, n
) < 0)
798 /* s.recvfrom(nbytes [,flags]) method */
801 BUILD_FUNC_DEF_2(PySocketSock_recvfrom
,PySocketSockObject
*,s
, PyObject
*,args
)
804 PyObject
*buf
, *addr
, *ret
;
805 int addrlen
, len
, n
, flags
;
807 if (!PyArg_Parse(args
, "i", &len
)) {
809 if (!PyArg_Parse(args
, "(ii)", &len
, &flags
))
812 if (!getsockaddrlen(s
, &addrlen
))
814 buf
= PyString_FromStringAndSize((char *) 0, len
);
817 Py_BEGIN_ALLOW_THREADS
818 n
= recvfrom(s
->sock_fd
, PyString_AsString(buf
), len
, flags
,
820 (ANY
*)addrbuf
, &addrlen
);
822 (struct sockaddr
*)addrbuf
, &addrlen
);
827 return PySocket_Err();
829 if (_PyString_Resize(&buf
, n
) < 0)
831 addr
= makesockaddr((struct sockaddr
*)addrbuf
, addrlen
);
832 ret
= Py_BuildValue("OO", buf
, addr
);
839 /* s.send(data [,flags]) method */
842 BUILD_FUNC_DEF_2(PySocketSock_send
,PySocketSockObject
*,s
, PyObject
*,args
)
847 if (!PyArg_Parse(args
, "s#", &buf
, &len
)) {
849 if (!PyArg_Parse(args
, "(s#i)", &buf
, &len
, &flags
))
852 Py_BEGIN_ALLOW_THREADS
853 n
= send(s
->sock_fd
, buf
, len
, flags
);
856 return PySocket_Err();
857 return PyInt_FromLong((long)n
);
861 /* s.sendto(data, [flags,] sockaddr) method */
864 BUILD_FUNC_DEF_2(PySocketSock_sendto
,PySocketSockObject
*,s
, PyObject
*,args
)
868 struct sockaddr
*addr
;
869 int addrlen
, len
, n
, flags
;
871 if (!PyArg_Parse(args
, "(s#O)", &buf
, &len
, &addro
)) {
873 if (!PyArg_Parse(args
, "(s#iO)", &buf
, &len
, &flags
, &addro
))
876 if (!getsockaddrarg(s
, addro
, &addr
, &addrlen
))
878 Py_BEGIN_ALLOW_THREADS
879 n
= sendto(s
->sock_fd
, buf
, len
, flags
, addr
, addrlen
);
882 return PySocket_Err();
883 return PyInt_FromLong((long)n
);
887 /* s.shutdown(how) method */
890 BUILD_FUNC_DEF_2(PySocketSock_shutdown
,PySocketSockObject
*,s
, PyObject
*,args
)
894 if (!PyArg_GetInt(args
, &how
))
896 Py_BEGIN_ALLOW_THREADS
897 res
= shutdown(s
->sock_fd
, how
);
900 return PySocket_Err();
906 /* List of methods for socket objects */
908 static PyMethodDef PySocketSock_methods
[] = {
909 {"accept", (PyCFunction
)PySocketSock_accept
},
911 {"allowbroadcast", (PyCFunction
)PySocketSock_allowbroadcast
},
913 {"setblocking", (PyCFunction
)PySocketSock_setblocking
},
914 {"setsockopt", (PyCFunction
)PySocketSock_setsockopt
},
915 {"getsockopt", (PyCFunction
)PySocketSock_getsockopt
},
916 {"bind", (PyCFunction
)PySocketSock_bind
},
917 {"close", (PyCFunction
)PySocketSock_close
},
918 {"connect", (PyCFunction
)PySocketSock_connect
},
919 {"fileno", (PyCFunction
)PySocketSock_fileno
},
920 {"getsockname", (PyCFunction
)PySocketSock_getsockname
},
921 #ifdef HAVE_GETPEERNAME
922 {"getpeername", (PyCFunction
)PySocketSock_getpeername
},
924 {"listen", (PyCFunction
)PySocketSock_listen
},
926 {"makefile", (PyCFunction
)PySocketSock_makefile
, 1},
928 {"recv", (PyCFunction
)PySocketSock_recv
},
929 {"recvfrom", (PyCFunction
)PySocketSock_recvfrom
},
930 {"send", (PyCFunction
)PySocketSock_send
},
931 {"sendto", (PyCFunction
)PySocketSock_sendto
},
932 {"shutdown", (PyCFunction
)PySocketSock_shutdown
},
933 {NULL
, NULL
} /* sentinel */
937 /* Deallocate a socket object in response to the last Py_DECREF().
938 First close the file description. */
941 BUILD_FUNC_DEF_1(PySocketSock_dealloc
,PySocketSockObject
*,s
)
943 (void) close(s
->sock_fd
);
948 /* Return a socket object's named attribute. */
951 BUILD_FUNC_DEF_2(PySocketSock_getattr
,PySocketSockObject
*,s
, char *,name
)
953 return Py_FindMethod(PySocketSock_methods
, (PyObject
*) s
, name
);
958 BUILD_FUNC_DEF_1(PySocketSock_repr
,PySocketSockObject
*,s
)
962 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
963 s
->sock_fd
, s
->sock_family
, s
->sock_type
, s
->sock_proto
);
964 return PyString_FromString(buf
);
968 /* Type object for socket objects. */
970 static PyTypeObject PySocketSock_Type
= {
971 PyObject_HEAD_INIT(0) /* Must fill in type value later */
974 sizeof(PySocketSockObject
),
976 (destructor
)PySocketSock_dealloc
, /*tp_dealloc*/
978 (getattrfunc
)PySocketSock_getattr
, /*tp_getattr*/
981 (reprfunc
)PySocketSock_repr
, /*tp_repr*/
983 0, /*tp_as_sequence*/
988 /* Python interface to gethostname(). */
992 BUILD_FUNC_DEF_2(PySocket_gethostname
,PyObject
*,self
, PyObject
*,args
)
996 if (!PyArg_NoArgs(args
))
998 Py_BEGIN_ALLOW_THREADS
999 res
= gethostname(buf
, (int) sizeof buf
- 1);
1000 Py_END_ALLOW_THREADS
1002 return PySocket_Err();
1003 buf
[sizeof buf
- 1] = '\0';
1004 return PyString_FromString(buf
);
1008 /* Python interface to gethostbyname(name). */
1012 BUILD_FUNC_DEF_2(PySocket_gethostbyname
,PyObject
*,self
, PyObject
*,args
)
1015 struct sockaddr_in addrbuf
;
1016 if (!PyArg_Parse(args
, "s", &name
))
1018 if (setipaddr(name
, &addrbuf
) < 0)
1020 return makeipaddr(&addrbuf
);
1023 /* Python interface to gethostbyaddr(IP). */
1027 BUILD_FUNC_DEF_2(PySocket_gethostbyaddr
,PyObject
*,self
, PyObject
*, args
)
1029 struct sockaddr_in addr
;
1033 PyObject
*rtn_tuple
= (PyObject
*)NULL
;
1034 PyObject
*name_list
= (PyObject
*)NULL
;
1035 PyObject
*addr_list
= (PyObject
*)NULL
;
1038 if (!PyArg_Parse(args
, "s", &ip_num
))
1040 if (setipaddr(ip_num
, &addr
) < 0)
1042 h
= gethostbyaddr((char *)&addr
.sin_addr
,
1043 sizeof(addr
.sin_addr
),
1046 #ifdef HAVE_HSTRERROR
1047 /* Let's get real error message to return */
1049 PyErr_SetString(PySocket_Error
, (char *)hstrerror(h_errno
));
1051 PyErr_SetString(PySocket_Error
, "host not found");
1055 if ((name_list
= PyList_New(0)) == NULL
)
1057 if ((addr_list
= PyList_New(0)) == NULL
)
1059 for (pch
= h
->h_aliases
; *pch
!= NULL
; pch
++) {
1060 tmp
= PyString_FromString(*pch
);
1063 PyList_Append(name_list
, tmp
);
1066 for (pch
= h
->h_addr_list
; *pch
!= NULL
; pch
++) {
1067 memcpy((char *) &addr
.sin_addr
, *pch
, h
->h_length
);
1068 tmp
= makeipaddr(&addr
);
1071 PyList_Append(addr_list
, tmp
);
1074 rtn_tuple
= Py_BuildValue("sOO", h
->h_name
, name_list
, addr_list
);
1076 Py_XDECREF(name_list
);
1077 Py_XDECREF(addr_list
);
1082 /* Python interface to getservbyname(name).
1083 This only returns the port number, since the other info is already
1084 known or not useful (like the list of aliases). */
1088 BUILD_FUNC_DEF_2(PySocket_getservbyname
,PyObject
*,self
, PyObject
*,args
)
1092 if (!PyArg_Parse(args
, "(ss)", &name
, &proto
))
1094 Py_BEGIN_ALLOW_THREADS
1095 sp
= getservbyname(name
, proto
);
1096 Py_END_ALLOW_THREADS
1098 PyErr_SetString(PySocket_Error
, "service/proto not found");
1101 return PyInt_FromLong((long) ntohs(sp
->s_port
));
1105 /* Python interface to socket(family, type, proto).
1106 The third (protocol) argument is optional.
1107 Return a new socket object. */
1111 BUILD_FUNC_DEF_2(PySocket_socket
,PyObject
*,self
, PyObject
*,args
)
1113 PySocketSockObject
*s
;
1114 int fd
, family
, type
, proto
;
1116 if (!PyArg_Parse(args
, "(ii)", &family
, &type
)) {
1118 if (!PyArg_Parse(args
, "(iii)", &family
, &type
, &proto
))
1121 Py_BEGIN_ALLOW_THREADS
1122 fd
= socket(family
, type
, proto
);
1123 Py_END_ALLOW_THREADS
1125 return PySocket_Err();
1126 s
= PySocketSock_New(fd
, family
, type
, proto
);
1127 /* If the object can't be created, don't forget to close the
1128 file descriptor again! */
1131 /* From now on, ignore SIGPIPE and let the error checking
1134 (void) signal(SIGPIPE
, SIG_IGN
);
1136 return (PyObject
*) s
;
1140 /* Create a socket object from a numeric file description.
1141 Useful e.g. if stdin is a socket.
1142 Additional arguments as for socket(). */
1146 BUILD_FUNC_DEF_2(PySocket_fromfd
,PyObject
*,self
, PyObject
*,args
)
1148 PySocketSockObject
*s
;
1149 int fd
, family
, type
, proto
;
1151 if (!PyArg_Parse(args
, "(iii)", &fd
, &family
, &type
)) {
1153 if (!PyArg_Parse(args
, "(iiii)", &fd
, &family
, &type
, &proto
))
1156 /* Dup the fd so it and the socket can be closed independently */
1159 return PySocket_Err();
1160 s
= PySocketSock_New(fd
, family
, type
, proto
);
1161 /* From now on, ignore SIGPIPE and let the error checking
1164 (void) signal(SIGPIPE
, SIG_IGN
);
1166 return (PyObject
*) s
;
1170 /* List of functions exported by this module. */
1172 static PyMethodDef PySocket_methods
[] = {
1173 {"gethostbyname", PySocket_gethostbyname
},
1174 {"gethostbyaddr", PySocket_gethostbyaddr
},
1175 {"gethostname", PySocket_gethostname
},
1176 {"getservbyname", PySocket_getservbyname
},
1177 {"socket", PySocket_socket
},
1179 {"fromfd", PySocket_fromfd
},
1181 {NULL
, NULL
} /* Sentinel */
1185 /* Convenience routine to export an integer value.
1186 For simplicity, errors (which are unlikely anyway) are ignored. */
1189 BUILD_FUNC_DEF_3(insint
,PyObject
*,d
, char *,name
, int,value
)
1191 PyObject
*v
= PyInt_FromLong((long) value
);
1193 /* Don't bother reporting this error */
1197 PyDict_SetItemString(d
, name
, v
);
1203 /* Initialize this module.
1204 This is called when the first 'import socket' is done,
1205 via a table in config.c, if config.c is compiled with USE_SOCKET
1212 m
= Py_InitModule("socket", PySocket_methods
);
1213 d
= PyModule_GetDict(m
);
1214 PySocket_Error
= PyString_FromString("socket.error");
1215 if (PySocket_Error
== NULL
||
1216 PyDict_SetItemString(d
, "error", PySocket_Error
) != 0)
1217 Py_FatalError("can't define socket.error");
1218 insint(d
, "AF_INET", AF_INET
);
1220 insint(d
, "AF_UNIX", AF_UNIX
);
1221 #endif /* AF_UNIX */
1222 insint(d
, "SOCK_STREAM", SOCK_STREAM
);
1223 insint(d
, "SOCK_DGRAM", SOCK_DGRAM
);
1224 insint(d
, "SOCK_RAW", SOCK_RAW
);
1225 insint(d
, "SOCK_SEQPACKET", SOCK_SEQPACKET
);
1226 insint(d
, "SOCK_RDM", SOCK_RDM
);
1229 insint(d
, "SO_DEBUG", SO_DEBUG
);
1231 #ifdef SO_ACCEPTCONN
1232 insint(d
, "SO_ACCEPTCONN", SO_ACCEPTCONN
);
1235 insint(d
, "SO_REUSEADDR", SO_REUSEADDR
);
1238 insint(d
, "SO_KEEPALIVE", SO_KEEPALIVE
);
1241 insint(d
, "SO_DONTROUTE", SO_DONTROUTE
);
1244 insint(d
, "SO_BROADCAST", SO_BROADCAST
);
1246 #ifdef SO_USELOOPBACK
1247 insint(d
, "SO_USELOOPBACK", SO_USELOOPBACK
);
1250 insint(d
, "SO_LINGER", SO_LINGER
);
1253 insint(d
, "SO_OOBINLINE", SO_OOBINLINE
);
1256 insint(d
, "SO_REUSEPORT", SO_REUSEPORT
);
1260 insint(d
, "SO_SNDBUF", SO_SNDBUF
);
1263 insint(d
, "SO_RCVBUF", SO_RCVBUF
);
1266 insint(d
, "SO_SNDLOWAT", SO_SNDLOWAT
);
1269 insint(d
, "SO_RCVLOWAT", SO_RCVLOWAT
);
1272 insint(d
, "SO_SNDTIMEO", SO_SNDTIMEO
);
1275 insint(d
, "SO_RCVTIMEO", SO_RCVTIMEO
);
1278 insint(d
, "SO_ERROR", SO_ERROR
);
1281 insint(d
, "SO_TYPE", SO_TYPE
);
1284 /* Maximum number of connections for "listen" */
1286 insint(d
, "SOMAXCONN", SOMAXCONN
);
1288 insint(d
, "SOMAXCONN", 5); /* Common value */
1291 /* Flags for send, recv */
1293 insint(d
, "MSG_OOB", MSG_OOB
);
1296 insint(d
, "MSG_PEEK", MSG_PEEK
);
1298 #ifdef MSG_DONTROUTE
1299 insint(d
, "MSG_DONTROUTE", MSG_DONTROUTE
);
1302 insint(d
, "MSG_EOR", MSG_EOR
);
1305 insint(d
, "MSG_TRUNC", MSG_TRUNC
);
1308 insint(d
, "MSG_CTRUNC", MSG_CTRUNC
);
1311 insint(d
, "MSG_WAITALL", MSG_WAITALL
);
1314 insint(d
, "MSG_BTAG", MSG_BTAG
);
1317 insint(d
, "MSG_ETAG", MSG_ETAG
);
1320 /* Protocol level and numbers, usable for [gs]etsockopt */
1322 insint(d
, "SOL_SOCKET", SOL_SOCKET
);
1325 insint(d
, "IPPROTO_IP", IPPROTO_IP
);
1328 insint(d
, "IPPROTO_ICMP", IPPROTO_ICMP
);
1331 insint(d
, "IPPROTO_IGMP", IPPROTO_IGMP
);
1334 insint(d
, "IPPROTO_GGP", IPPROTO_GGP
);
1337 insint(d
, "IPPROTO_TCP", IPPROTO_TCP
);
1340 insint(d
, "IPPROTO_EGP", IPPROTO_EGP
);
1343 insint(d
, "IPPROTO_PUP", IPPROTO_PUP
);
1346 insint(d
, "IPPROTO_UDP", IPPROTO_UDP
);
1349 insint(d
, "IPPROTO_IDP", IPPROTO_IDP
);
1351 #ifdef IPPROTO_HELLO
1352 insint(d
, "IPPROTO_HELLO", IPPROTO_HELLO
);
1355 insint(d
, "IPPROTO_ND", IPPROTO_ND
);
1358 insint(d
, "IPPROTO_TP", IPPROTO_TP
);
1361 insint(d
, "IPPROTO_XTP", IPPROTO_XTP
);
1364 insint(d
, "IPPROTO_EON", IPPROTO_EON
);
1367 insint(d
, "IPPROTO_BIP", IPPROTO_BIP
);
1371 insint(d
, "IPPROTO_RAW", IPPROTO_RAW
);
1374 insint(d
, "IPPROTO_MAX", IPPROTO_MAX
);
1377 /* Some port configuration */
1378 #ifdef IPPORT_RESERVED
1379 insint(d
, "IPPORT_RESERVED", IPPORT_RESERVED
);
1381 insint(d
, "IPPORT_RESERVED", 1024);
1383 #ifdef IPPORT_USERRESERVED
1384 insint(d
, "IPPORT_USERRESERVED", IPPORT_USERRESERVED
);
1386 insint(d
, "IPPORT_USERRESERVED", 5000);
1389 /* Some reserved IP v.4 addresses */
1391 insint(d
, "INADDR_ANY", INADDR_ANY
);
1393 insint(d
, "INADDR_ANY", 0x00000000);
1395 #ifdef INADDR_BROADCAST
1396 insint(d
, "INADDR_BROADCAST", INADDR_BROADCAST
);
1398 insint(d
, "INADDR_BROADCAST", 0xffffffff);
1400 #ifdef INADDR_LOOPBACK
1401 insint(d
, "INADDR_LOOPBACK", INADDR_LOOPBACK
);
1403 insint(d
, "INADDR_LOOPBACK", 0x7F000001);
1405 #ifdef INADDR_UNSPEC_GROUP
1406 insint(d
, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP
);
1408 insint(d
, "INADDR_UNSPEC_GROUP", 0xe0000000);
1410 #ifdef INADDR_ALLHOSTS_GROUP
1411 insint(d
, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP
);
1413 insint(d
, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1415 #ifdef INADDR_MAX_LOCAL_GROUP
1416 insint(d
, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP
);
1418 insint(d
, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1421 insint(d
, "INADDR_NONE", INADDR_NONE
);
1423 insint(d
, "INADDR_NONE", 0xffffffff);
1426 /* IP [gs]etsockopt options */
1428 insint(d
, "IP_OPTIONS", IP_OPTIONS
);
1431 insint(d
, "IP_HDRINCL", IP_HDRINCL
);
1434 insint(d
, "IP_TOS", IP_TOS
);
1437 insint(d
, "IP_TTL", IP_TTL
);
1440 insint(d
, "IP_RECVOPTS", IP_RECVOPTS
);
1442 #ifdef IP_RECVRETOPTS
1443 insint(d
, "IP_RECVRETOPTS", IP_RECVRETOPTS
);
1445 #ifdef IP_RECVDSTADDR
1446 insint(d
, "IP_RECVDSTADDR", IP_RECVDSTADDR
);
1449 insint(d
, "IP_RETOPTS", IP_RETOPTS
);
1451 #ifdef IP_MULTICAST_IF
1452 insint(d
, "IP_MULTICAST_IF", IP_MULTICAST_IF
);
1454 #ifdef IP_MULTICAST_TTL
1455 insint(d
, "IP_MULTICAST_TTL", IP_MULTICAST_TTL
);
1457 #ifdef IP_MULTICAST_LOOP
1458 insint(d
, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP
);
1460 #ifdef IP_ADD_MEMBERSHIP
1461 insint(d
, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP
);
1463 #ifdef IP_DROP_MEMBERSHIP
1464 insint(d
, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP
);
1468 /* All windows sockets require a successful WSAStartup() before use */
1470 const int opt
= SO_SYNCHRONOUS_NONALERT
;
1473 ret
= WSAStartup(0x0101, &WSAData
); /* request version 1.1 */
1475 case WSASYSNOTREADY
:
1476 PyErr_SetString(PySocket_Error
,
1477 "WSAStartup failed: Network not ready\n");
1479 case WSAVERNOTSUPPORTED
:
1481 PyErr_SetString(PySocket_Error
,
1482 "WSAStartup failed: Requested version not supported");
1485 /* Setup sockets in non-overlapped mode by default */
1486 if (setsockopt(INVALID_SOCKET
,SOL_SOCKET
,SO_OPENTYPE
,
1487 (const char *)&opt
,sizeof(opt
)) != 0)
1488 PyErr_SetString(PySocket_Error
,
1489 "setsockopt failed in initsocket");
1492 PyErr_SetString(PySocket_Error
,
1493 "WSAStartup failed");
1501 BOOL WINAPI
DllMain (HANDLE hInst
,
1502 ULONG ul_reason_for_call
,
1505 const int opt
= SO_SYNCHRONOUS_NONALERT
;
1506 switch (ul_reason_for_call
)
1508 case DLL_PROCESS_ATTACH
: {
1511 char buf
[100] = "Python can't initialize Windows Sockets Module!\n\r";
1512 if (WSAStartup(MAKEWORD(1,1), &WSAData
)) {
1513 wsprintf(buf
+strlen(buf
), "WSAStartup failed (%d)",WSAGetLastError());
1517 ** Setup sockets in non-overlapped mode by default
1519 // if (ok && setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(const char *)&opt,sizeof(opt)) != 0) {
1520 // wsprintf(buf+strlen(buf),"setsockopt failed (%d)",WSAGetLastError());
1524 MessageBox(NULL
,buf
,"WinSock Error",MB_OK
|MB_SETFOREGROUND
);
1530 case DLL_PROCESS_DETACH
: