更新的问题:
套接字对象实际上是从哪里创建的?我在socketmodule.c的 4188行找到了这个,但看起来它叫做sock_new而不是套接字?
static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Run Code Online (Sandbox Code Playgroud)是否有一些约定来确定导入socketmodule.c之类的模块的位置?换句话说,当我看到"来自_socket import*"时,谁知道导入的是什么(不搜索整个存储库)?
原版的:
sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Run Code Online (Sandbox Code Playgroud)
我试图理解这段代码是如何工作的,具体是如何/在哪里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))
Run Code Online (Sandbox Code Playgroud)
当我在维基百科上查找BSD套接字时,我看到这个例子是有意义的,因为套接字函数是在types.h下定义的.在上面我看到调用realsocket看起来像一个OS函数调用,但我没有在任何地方定义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);
Run Code Online (Sandbox Code Playgroud)
它拥有一切做的1 日和2 个从行socket.py:
import _socket
from _socket import *
Run Code Online (Sandbox Code Playgroud)
如果您启动Python并运行以下代码:
import socket
print dir(socket)
print dir(socket._socket)
Run Code Online (Sandbox Code Playgroud)
你会注意到套接字只会输出一些额外的东西socket._socket.
现在,是什么socket._socket?这是一个Python的动态模块(这意味着它可以用来就像任何其他的Python模块),但它写在Ç(所以编译后它有一个OS特定原始形式:.所以在尼克斯和.dll文件(.pyd)下赢).它的位置在python lib文件夹中(socket.py也位于其中):lib-dynload/_socket*.so.
您可以通过打印模块来查看模块所在的位置(在运行上述代码的控制台中,您可以键入):
print socket
print socket._socket
Run Code Online (Sandbox Code Playgroud)
如果您更感兴趣,它的源代码位于$ {PYTHON_SRC_DIR} /Modules/socketmodule.c中的Python源代码tarball中(它还有一个头文件).在这些文件中,定义了包装函数(从Python可见),它们调用本机函数(例如来自/usr/include/sys/socket.h的套接字).