探究python与linux的socket接口间的关系

1. 实验环境

Ubuntu 16.04LTS

2. 利用python的socket接口实现一个简单的聊天小程序

server端

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind((‘127.0.0.1‘,8083))
server.listen(5)
print(‘starting...‘)
while True:
    conn, client_addr = server.accept()
    print(client_addr)
    while True:
        try:
            data = conn.recv(1024)
            if not data: break
            print(‘客户端的数据‘,data)
            response = input(‘>>>:‘).strip()
            conn.send(response.encode())
        except ConnectionResetError:
            break
    conn.close()
server.close()

client端

import socket

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((‘127.0.0.1‘,8083))
while True:
    msg = input(‘>>: ‘).strip()
    if not msg:continue
    client.send(msg.encode(‘utf-8‘))
    data=client.recv(1024)
    print(data.decode(‘utf-8‘))
client.close()

效果如下图所示

3. 探究python与linux下socket接口间的关系

vscode的代码提示告诉我们这个socket模块内部包装是_socket模块

我们再进去socket源码看看,导入模块第一个就是_socket,其余模块和socket接口关系不大。

顺藤摸瓜我们看看_socket究竟是何方神圣。首先需要找到_socket到底在哪,通过命令行print模块名我们找到它的路径如下,文件名为_socket.so,通过后缀我们知道它是linux系统的共享库文件,说白了_socket模块并不是python实现的。

好在python是开源的,我们要到源码仓库里找找了。在python的github仓库中我们以_socket关键字进行搜索。结果如下,可疑目标socketmodule.h出现。

socketmodule.h中出现了下面的几行,通过红色标记中的常量名称的含义我们知道该头文件的实现就是对应python中的_socket模块。

再看socketmodule.h中包含的头文件,会根据平台的不同分别包含linux 下的socket接口和windows下的socket接口,和我们预期十分吻合。

再看看socketmodule.h对应的实现文件socketmodule.c,我们发现如下c函数名与python socket对象方法名之间的映射。也证实了C中sockmodule模块确实是python中_socket的源码实现。

4. 结论

通过上面探究的过程,我们可以得出结论:就linux平台而言,python的socket对象是对共享库_socket.so的包装,而_socket.so是python源码中的socketmodule.c模块编译的结果,进一步的socketmodule.c又是对linux socket接口的封装。即python下socket模块并不是自己实现一套socket接口,而是对linux socket进行二次封装加强。

另外,本来打算修改一下socketmodule.c在其中加入测试代码然后重新编译出_socket.so模块替换原有的_socket.so。但是加入新代码后_socket.so就编译失败,奈何自己c语言水平太差,只能作罢。

原文地址:https://www.cnblogs.com/luoyang712/p/12008886.html

时间: 2024-10-31 03:03:10

探究python与linux的socket接口间的关系的相关文章

linux网络socket 接口转

linux网络socket 接口 1.socket函数:一个进程必须做的第一件事就是调用socket函数获得一个文件描述符. ----------------------------------------------------------------- #include<sys/socket.h> int socket(int family,int type,int protocol); 返回:非负描述字---成功 -1---失败 -----------------------------

Linux权限与命令间的关系

极重要!权限与命令间的关系: 我们知道权限对於使用者帐号来说是非常重要的,因为他可以限制使用者能不能读取/创建/删除/修改文件或目录! 在这一章我们介绍了很多文件系统的管理命令,第六章则介绍了很多文件权限的意义.在这个小节当中, 我们就将这两者结合起来,说明一下什么命令在什么样的权限下才能够运行吧!^_^ 一.让使用者能进入某目录成为『可工作目录』的基本权限为何: 可使用的命令:例如 cd 等变换工作目录的命令: 目录所需权限:使用者对这个目录至少需要具有 x 的权限 额外需求:如果使用者想要在

[Linux] 权限与指令间的关系

我们知道权限对于使用者帐号来说是非常重要的,因为他可以限制使用者能不能读取/创建/删除/修改文件或目录! 在这一章我们介绍了很多文件系统的管理指令,第五章则介绍了很多文件权限的意义.在这个小节当中, 我们就将这两者结合起来,说明一下什么指令在什么样的权限下才能够运行吧!^_^ 一.让使用者能进入某目录成为"可工作目录"的基本权限为何: 可使用的指令:例如 cd 等变换工作目录的指令: 目录所需权限:使用者对这个目录至少需要具有 x 的权限 额外需求:如果使用者想要在这个目录内利用 ls

python Socket编程-python API 与 Linux Socket API之间的关系

python socket编程 服务端 #!/usr/bin/env python # coding=utf-8 from socket import * HOST = '' PORT = 2345 BUFSIZE = 1024 ADDR = (HOST,PORT) #创建AF_INET地址族,TCP的套接字 with socket(AF_INET,SOCK_STREAM) as tcpSerSock: #绑定ip和端口 tcpSerSock.bind(ADDR) #监听端口,是否有请求 tcp

一个hello/hi的简单的网络聊天程序和python Socket API与Linux Socket API之间的关系

1.Socket概述 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网络套接字是IP地址与端口的组合. 套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点.通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到

[转]Linux的SOCKET编程详解

From : http://blog.csdn.net/hguisu/article/details/7445768 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared mem

Linux的SOCKET编程详解

1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信.网间进程通信要解决的是不同主机进程间的相

python网络编程之socket编程

一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 美好的愿望: 最常用的软件服务器是 Web 服务器.一台机器里放一些网页或 Web 应用程序,然后启动 服务.这样的服务器的任务就是接受客户的请求,把网页发给客户(如用户计算机上的浏览器),然 后等待下一个客户请求.这些服务启动后的目标就是"永远运行下去".虽然它们不可能实现这样的 目标,但只要没有关机或硬件出错等外力干扰,它们就能运行非常长的一段时间. 生活中的C/S架构: 商

linux c socket编程

1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信.网间进程通信要解决的是不同主机进程间的相