更新的问题:
实际上是在哪里创建套接字对象?我在socketmodule.c的第4188行找到了这个,但看起来它被称为sock_new而不是套接字?
static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
是否有一些约定用于确定导入socketmodule.c之类的模块的位置?换句话说,当我从_socket import *"中看到"我是谁知道导入的内容(不搜索整个存储库)?
ORIGINAL:
sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
我试图理解这段代码是如何工作的,具体是如何/在哪里Python实际上使OS函数调用socket():
class _socketobject(object):
__doc__ = _realsocket.__doc__
__slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
if _sock is None:
_sock = _realsocket(family, type, proto)
self._sock = _sock
for method in _delegate_methods:
setattr(self, method, getattr(_sock, method))
当我在维基百科上查找BSD套接字时,我看到这个例子是有意义的,因为套接字函数是在types.h下定义的。在上面我看到一个看起来像OS函数调用的realsocket调用,但我没有在任何地方定义realsocket(我在Python27 / include头文件中根本没有看到任何关于套接字的东西)。
/* Server code in C */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
struct sockaddr_in stSockAddr;
int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
答案 0 :(得分:5)
它与 socket.py 中的1 st 和2 nd 行有关:
import _socket
from _socket import *
如果你启动 Python 并运行以下代码:
import socket
print dir(socket)
print dir(socket._socket)
您会注意到套接字只会导出一些与socket._socket
相比的额外内容。
现在,socket._socket
是什么?它是一个 Python 动态模块(意味着它可以像任何其他python模块一样使用),但它是用 C 编写的(所以在编译后它有操作系统特定的本机格式: Nix 和 .dll ( .pyd 下的 .so >) Win 下。它的位置在python lib文件夹中( socket.py 也位于其中): lib-dynload / _socket * .so 。
您可以通过打印模块来查看模块的位置(在您运行上述代码的同一控制台中可以输入):
print socket
print socket._socket
如果您对此感兴趣,其源代码位于 $ {PYTHON_SRC_DIR} /Modules/socketmodule.c 中的 Python 源代码tarball中(它也是有一个头文件)。在这些文件中,定义了包装函数(从 Python 可见),它们调用本机函数(例如 socket /usr/include/sys/socket.h)。