【发布时间】:2015-07-02 16:50:14
【问题描述】:
更新问题:
-
套接字对象实际上是在哪里创建的?我在socketmodule.c 的第 4188 行找到了这个,但它看起来像是叫 sock_new 而不是 socket?
static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 是否有一些约定可以确定像 socketmodule.c 这样的模块的导入位置?换句话说,当我看到“from _socket import *”时,我知道谁在导入什么(无需搜索整个存储库)?
原文:
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))
当我在 Wikipedia 上查找 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);
【问题讨论】:
-
对我来说,Python27/lib 文件夹中有一个 socket.py。文件中有一些描述可用的特定于平台的函数调用的 cmets。
-
_realsocket = github.com/certik/python-2.7/blob/master/Lib/socket.py#L100的套接字
-
在
Python2.7.10压缩包中,Modules/socketmodule.c第 3192 行(在sock_initobjfunc 中)fd = socket(family, type, proto);。sock_new只是创建Python包装器对象。至于您的第二个问题socket.py只是_socket.so的包装器,它公开了动态模块所做的一切(+ 一些事情)。您可以直接导入_socket并查看其成员。