summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-07-07 20:45:43 (GMT)
committerGuido van Rossum <guido@python.org>1998-07-07 20:45:43 (GMT)
commit82a5c66a51f8a655ea134ad0b02d0843c77e7f36 (patch)
tree48b1d94c1195de0e4a774c15cd65783732b148e5
parenta4289a79f84c42ca256ae3b3f52919092067686e (diff)
downloadcpython-82a5c66a51f8a655ea134ad0b02d0843c77e7f36.zip
cpython-82a5c66a51f8a655ea134ad0b02d0843c77e7f36.tar.gz
cpython-82a5c66a51f8a655ea134ad0b02d0843c77e7f36.tar.bz2
Added copious docstrings, plus two minor layout tweaks.
-rw-r--r--Modules/socketmodule.c348
1 files changed, 309 insertions, 39 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index c200b2d..0eb3fd5 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -580,6 +580,13 @@ BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
return res;
}
+static char accept_doc[] =
+"accept() -> (socket object, address info)\n\
+\n\
+Wait for an incoming connection. Return a new socket representing the\n\
+connection, and the address of the client. For IP sockets, the address\n\
+info is a pair (hostaddr, port).";
+
/* s.setblocking(1 | 0) method */
@@ -615,6 +622,12 @@ BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
return Py_None;
}
+static char setblocking_doc[] =
+"setblocking(flag)\n\
+\n\
+Set the socket to blocking (flag is true) or non-blocking (false).\n\
+This uses the FIONBIO ioctl with the O_NDELAY flag.";
+
/* s.setsockopt() method.
With an integer third argument, sets an integer option.
@@ -648,6 +661,12 @@ BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args
return Py_None;
}
+static char setsockopt_doc[] =
+"setsockopt(level, option, value)\n\
+\n\
+Set a socket option. See the Unix manual for level and option.\n\
+The value argument can either be an integer or a string.";
+
/* s.getsockopt() method.
With two arguments, retrieves an integer option.
@@ -693,6 +712,13 @@ BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args
return buf;
}
+static char getsockopt_doc[] =
+"getsockopt(level, option[, buffersize]) -> value\n\
+\n\
+Get a socket option. See the Unix manual for level and option.\n\
+If a nonzero buffersize argument is given, the return value is a\n\
+string of that length; otherwise it is an integer.";
+
/* s.bind(sockaddr) method */
@@ -713,6 +739,12 @@ BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
return Py_None;
}
+static char bind_doc[] =
+"bind(address)\n\
+\n\
+Bind the socket to a local address. For IP sockets, the address is a\n\
+pair (host, port); the host must refer to the local host.";
+
/* s.close() method.
Set the file descriptor to -1 so operations tried subsequently
@@ -733,6 +765,11 @@ BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
return Py_None;
}
+static char close_doc[] =
+"close()\n\
+\n\
+Close the socket. It cannot be used after this call.";
+
/* s.connect(sockaddr) method */
@@ -753,6 +790,12 @@ BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
return Py_None;
}
+static char connect_doc[] =
+"connect(address)\n\
+\n\
+Connect the socket to a remote address. For IP sockets, the address\n\
+is a pair (host, port).";
+
/* s.connect_ex(sockaddr) method */
@@ -772,6 +815,12 @@ BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args
return PyInt_FromLong((long) res);
}
+static char connect_ex_doc[] =
+"connect_ex(address)\n\
+\n\
+This is like connect(address), but returns an error code (the errno value)\n\
+instead of raising an exception when an error occurs.";
+
/* s.fileno() method */
@@ -783,6 +832,11 @@ BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
return PyInt_FromLong((long) s->sock_fd);
}
+static char fileno_doc[] =
+"fileno() -> integer\n\
+\n\
+Return the integer file descriptor of the socket.";
+
#ifndef NO_DUP
/* s.dup() method */
@@ -805,6 +859,12 @@ BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
close(newfd);
return sock;
}
+
+static char dup_doc[] =
+"dup() -> socket object\n\
+\n\
+Return a new socket object connected to the same system resource.";
+
#endif
@@ -828,6 +888,12 @@ BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,arg
return makesockaddr((struct sockaddr *) addrbuf, addrlen);
}
+static char getsockname_doc[] =
+"getsockname() -> address info\n\
+\n\
+Return the address of the local endpoint. For IP sockets, the address\n\
+info is a pair (hostaddr, port).";
+
#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
/* s.getpeername() method */
@@ -848,6 +914,13 @@ BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,arg
return PySocket_Err();
return makesockaddr((struct sockaddr *) addrbuf, addrlen);
}
+
+static char getpeername_doc[] =
+"getpeername() -> address info\n\
+\n\
+Return the address of the remote endpoint. For IP sockets, the address\n\
+info is a pair (hostaddr, port).";
+
#endif /* HAVE_GETPEERNAME */
@@ -871,6 +944,14 @@ BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
return Py_None;
}
+static char listen_doc[] =
+"listen(backlog)\n\
+\n\
+Enable a server to accept connections. The backlog argument must be at\n\
+least 1; it specifies the number of unaccepted connection that the system\n\
+will allow before refusing new connections.";
+
+
#ifndef NO_DUP
/* s.makefile(mode) method.
Create a new open file object referring to a dupped version of
@@ -892,12 +973,12 @@ BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
return NULL;
#ifdef MS_WIN32
- if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
- ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
+ if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
+ ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
#else
- if ((fd = dup(s->sock_fd)) < 0 ||
- (fp = fdopen(fd, mode)) == NULL) {
+ if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
#endif
+ {
if (fd >= 0)
close(fd);
return PySocket_Err();
@@ -907,8 +988,16 @@ BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
PyFile_SetBufSize(f, bufsize);
return f;
}
+
+static char makefile_doc[] =
+"makefile([mode[, buffersize]]) -> file object\n\
+\n\
+Return a regular file object corresponding to the socket.\n\
+The mode and buffersize arguments are as for the built-in open() function.";
+
#endif /* NO_DUP */
+
/* s.recv(nbytes [,flags]) method */
static PyObject *
@@ -933,6 +1022,14 @@ BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
return buf;
}
+static char recv_doc[] =
+"recv(buffersize[, flags]) -> data\n\
+\n\
+Receive up to buffersize bytes from the socket. For the optional flags\n\
+argument, see the Unix manual. When no data is available, block until\n\
+at least one byte is available or until the remote end is closed. When\n\
+the remote end is closed and all data is read, return the empty string.";
+
/* s.recvfrom(nbytes [,flags]) method */
@@ -982,6 +1079,11 @@ BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
return ret;
}
+static char recvfrom_doc[] =
+"recvfrom(buffersize[, flags]) -> (data, address info)\n\
+\n\
+Like recv(buffersize, flags) but also return the sender's address info.";
+
/* s.send(data [,flags]) method */
@@ -1000,6 +1102,12 @@ BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
return PyInt_FromLong((long)n);
}
+static char send_doc[] =
+"send(data[, flags])\n\
+\n\
+Send a data string to the socket. For the optional flags\n\
+argument, see the Unix manual.";
+
/* s.sendto(data, [flags,] sockaddr) method */
@@ -1026,6 +1134,12 @@ BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
return PyInt_FromLong((long)n);
}
+static char sendto_doc[] =
+"sendto(data[, flags], address)\n\
+\n\
+Like send(data, flags) but allows specifying the destination address.\n\
+For IP sockets, the address is a pair (hostaddr, port).";
+
/* s.shutdown(how) method */
@@ -1045,35 +1159,60 @@ BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
return Py_None;
}
+static char shutdown_doc[] =
+"shutdown(flag)\n\
+\n\
+Shut down the reading side of the socket (flag == 0), the writing side\n\
+of the socket (flag == 1), or both ends (flag == 2).";
+
/* List of methods for socket objects */
static PyMethodDef PySocketSock_methods[] = {
- {"accept", (PyCFunction)PySocketSock_accept},
- {"setblocking", (PyCFunction)PySocketSock_setblocking},
- {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
- {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1},
- {"bind", (PyCFunction)PySocketSock_bind},
- {"close", (PyCFunction)PySocketSock_close},
- {"connect", (PyCFunction)PySocketSock_connect},
- {"connect_ex", (PyCFunction)PySocketSock_connect_ex},
- {"fileno", (PyCFunction)PySocketSock_fileno},
+ {"accept", (PyCFunction)PySocketSock_accept, 0,
+ accept_doc},
+ {"bind", (PyCFunction)PySocketSock_bind, 0,
+ bind_doc},
+ {"close", (PyCFunction)PySocketSock_close, 0,
+ close_doc},
+ {"connect", (PyCFunction)PySocketSock_connect, 0,
+ connect_doc},
+ {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
+ connect_ex_doc},
#ifndef NO_DUP
- {"dup", (PyCFunction)PySocketSock_dup},
+ {"dup", (PyCFunction)PySocketSock_dup, 0,
+ dup_doc},
#endif
- {"getsockname", (PyCFunction)PySocketSock_getsockname},
+ {"fileno", (PyCFunction)PySocketSock_fileno, 0,
+ fileno_doc},
#ifdef HAVE_GETPEERNAME
- {"getpeername", (PyCFunction)PySocketSock_getpeername},
-#endif
- {"listen", (PyCFunction)PySocketSock_listen},
+ {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
+ getpeername_doc},
+#endif
+ {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
+ getsockname_doc},
+ {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
+ getsockopt_doc},
+ {"listen", (PyCFunction)PySocketSock_listen, 0,
+ listen_doc},
#ifndef NO_DUP
- {"makefile", (PyCFunction)PySocketSock_makefile, 1},
-#endif
- {"recv", (PyCFunction)PySocketSock_recv, 1},
- {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1},
- {"send", (PyCFunction)PySocketSock_send, 1},
- {"sendto", (PyCFunction)PySocketSock_sendto},
- {"shutdown", (PyCFunction)PySocketSock_shutdown},
+ {"makefile", (PyCFunction)PySocketSock_makefile, 1,
+ makefile_doc},
+#endif
+ {"recv", (PyCFunction)PySocketSock_recv, 1,
+ recv_doc},
+ {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
+ recvfrom_doc},
+ {"send", (PyCFunction)PySocketSock_send, 1,
+ send_doc},
+ {"sendto", (PyCFunction)PySocketSock_sendto, 0,
+ sendto_doc},
+ {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
+ setblocking_doc},
+ {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
+ setsockopt_doc},
+ {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
+ shutdown_doc},
{NULL, NULL} /* sentinel */
};
@@ -1148,6 +1287,11 @@ BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
return PyString_FromString(buf);
}
+static char gethostname_doc[] =
+"gethostname() -> string\n\
+\n\
+Return the current host name.";
+
/* Python interface to gethostbyname(name). */
@@ -1164,6 +1308,12 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
return makeipaddr(&addrbuf);
}
+static char gethostbyname_doc[] =
+"gethostbyname(host) -> address\n\
+\n\
+Return the IP address (a string of the form '255.255.255.255') for a host.";
+
+
/* Python interface to gethostbyaddr(IP). */
/*ARGSUSED*/
@@ -1249,6 +1399,12 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
return rtn_tuple;
}
+static char gethostbyaddr_doc[] =
+"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
+\n\
+Return the true host name, a list of aliases, and a list of IP addresses,\n\
+for a host. The host argument is a string giving a host name or IP number.";
+
/* Python interface to getservbyname(name).
This only returns the port number, since the other info is already
@@ -1272,6 +1428,12 @@ BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
return PyInt_FromLong((long) ntohs(sp->s_port));
}
+static char getservbyname_doc[] =
+"getservbyname(servicename, protocolname) -> integer\n\
+\n\
+Return a port number from a service name and protocol name.\n\
+The protocol name should be 'tcp' or 'udp'.";
+
/* Python interface to getprotobyname(name).
This only returns the protocol number, since the other info is
@@ -1295,6 +1457,11 @@ BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
return PyInt_FromLong((long) sp->p_proto);
}
+static char getprotobyname_doc[] =
+"getprotobyname(name) -> integer\n\
+\n\
+Return the protocol number for the named protocol. (Rarely used.)";
+
/* Python interface to socket(family, type, proto).
The third (protocol) argument is optional.
@@ -1335,6 +1502,16 @@ BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
return (PyObject *) s;
}
+static char socket_doc[] =
+"socket(family, type[, proto]) -> socket object\n\
+\n\
+Open a socket of the given type. The family argument specifies the\n\
+address family; it is normally AF_INET, sometimes AF_UNIX.\n\
+The type argument specifies whether this is a stream (SOCK_STREAM)\n\
+or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
+specifying the default protocol.";
+
+
#ifndef NO_DUP
/* Create a socket object from a numeric file description.
Useful e.g. if stdin is a socket.
@@ -1360,8 +1537,16 @@ BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
#endif
return (PyObject *) s;
}
+
+static char fromfd_doc[] =
+"fromfd(fd, family, type[, proto]) -> socket object\n\
+\n\
+Create a socket object from the given file descriptor.\n\
+The remaining arguments are the same as for socket().";
+
#endif /* NO_DUP */
+
static PyObject *
BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
{
@@ -1374,6 +1559,12 @@ BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
return PyInt_FromLong(x2);
}
+static char ntohs_doc[] =
+"ntohs(integer) -> integer\n\
+\n\
+Convert a 16-bit integer from network to host byte order.";
+
+
static PyObject *
BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
{
@@ -1386,6 +1577,12 @@ BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
return PyInt_FromLong(x2);
}
+static char ntohl_doc[] =
+"ntohl(integer) -> integer\n\
+\n\
+Convert a 32-bit integer from network to host byte order.";
+
+
static PyObject *
BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
{
@@ -1398,6 +1595,12 @@ BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
return PyInt_FromLong(x2);
}
+static char htons_doc[] =
+"htons(integer) -> integer\n\
+\n\
+Convert a 16-bit integer from host to network byte order.";
+
+
static PyObject *
BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
{
@@ -1410,22 +1613,28 @@ BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
return PyInt_FromLong(x2);
}
+static char htonl_doc[] =
+"htonl(integer) -> integer\n\
+\n\
+Convert a 32-bit integer from host to network byte order.";
+
+
/* List of functions exported by this module. */
static PyMethodDef PySocket_methods[] = {
- {"gethostbyname", PySocket_gethostbyname},
- {"gethostbyaddr", PySocket_gethostbyaddr},
- {"gethostname", PySocket_gethostname},
- {"getservbyname", PySocket_getservbyname},
- {"getprotobyname", PySocket_getprotobyname},
- {"socket", PySocket_socket, 1},
+ {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
+ {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
+ {"gethostname", PySocket_gethostname, 0, gethostname_doc},
+ {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
+ {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
+ {"socket", PySocket_socket, 1, socket_doc},
#ifndef NO_DUP
- {"fromfd", PySocket_fromfd, 1},
+ {"fromfd", PySocket_fromfd, 1, fromfd_doc},
#endif
- {"ntohs", PySocket_ntohs},
- {"ntohl", PySocket_ntohl},
- {"htons", PySocket_htons},
- {"htonl", PySocket_htonl},
+ {"ntohs", PySocket_ntohs, 0, ntohs_doc},
+ {"ntohl", PySocket_ntohl, 0, ntohl_doc},
+ {"htons", PySocket_htons, 0, htons_doc},
+ {"htonl", PySocket_htonl, 0, htonl_doc},
{NULL, NULL} /* Sentinel */
};
@@ -1534,6 +1743,66 @@ OS2init()
* operating system's filesystem layer.
*/
+static char module_doc[] =
+"This module provides socket operations and some related functions.\n\
+On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
+On other systems, it only supports IP.\n\
+\n\
+Functions:\n\
+\n\
+socket() -- create a new socket object\n\
+fromfd() -- create a socket object from an open file descriptor (*)\n\
+gethostname() -- return the current hostname\n\
+gethostbyname() -- map a hostname to its IP number\n\
+gethostbyaddr() -- map an IP number or hostname to DNS info\n\
+getservbyname() -- map a service name and a protocol name to a port number\n\
+getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
+ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
+htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
+\n\
+(*) not available on all platforms!)\n\
+\n\
+Special objects:\n\
+\n\
+SocketType -- type object for socket objects\n\
+error -- exception raised for I/O errors\n\
+\n\
+Integer constants:\n\
+\n\
+AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
+SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
+\n\
+Many other constants may be defined; these may be used in calls to\n\
+the setsockopt() and getsockopt() methods.\n\
+";
+
+static char sockettype_doc[] =
+"A socket represents one endpoint of a network connection.\n\
+\n\
+Methods:\n\
+\n\
+accept() -- accept a connection, returning new socket and client address\n\
+bind() -- bind the socket to a local address\n\
+close() -- close the socket\n\
+connect() -- connect the socket to a remote address\n\
+connect_ex() -- connect, return an error code instead of an exception \n\
+dup() -- return a new socket object identical to the current one (*)\n\
+fileno() -- return underlying file descriptor\n\
+getpeername() -- return remote address (*)\n\
+getsockname() -- return local address\n\
+getsockopt() -- get socket options\n\
+listen() -- start listening for incoming connections\n\
+makefile() -- return a file object corresponding tot the socket (*)\n\
+recv() -- receive data\n\
+recvfrom() -- receive data and sender's address\n\
+send() -- send data\n\
+sendto() -- send data to a given address\n\
+setblocking() -- set or clear the blocking I/O flag\n\
+setsockopt() -- set socket options\n\
+shutdown() -- shut down traffic in one or both directions\n\
+\n\
+(*) not available on all platforms!)";
+
void
#if defined(MS_WINDOWS) || defined(PYOS_OS2)
init_socket()
@@ -1545,14 +1814,14 @@ initsocket()
#ifdef MS_WINDOWS
if (!NTinit())
return;
- m = Py_InitModule("_socket", PySocket_methods);
+ m = Py_InitModule3("_socket", PySocket_methods, module_doc);
#else
#if defined(__TOS_OS2__)
if (!OS2init())
return;
- m = Py_InitModule("_socket", PySocket_methods);
+ m = Py_InitModule3("_socket", PySocket_methods, module_doc);
#else
- m = Py_InitModule("socket", PySocket_methods);
+ m = Py_InitModule3("socket", PySocket_methods, module_doc);
#endif
#endif
d = PyModule_GetDict(m);
@@ -1561,6 +1830,7 @@ initsocket()
return;
PyDict_SetItemString(d, "error", PySocket_Error);
PySocketSock_Type.ob_type = &PyType_Type;
+ PySocketSock_Type.tp_doc = sockettype_doc;
Py_INCREF(&PySocketSock_Type);
if (PyDict_SetItemString(d, "SocketType",
(PyObject *)&PySocketSock_Type) != 0)