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

1. 实验环境

Ubuntu 16.04LTS

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

server端

importsocket

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:

breakconn.close()

server.close()

client端

importsocket

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(('127.0.0.1',8083))whileTrue:

msg= input('>>:').strip()if not msg:continueclient.send(msg.encode('utf-8'))

data=client.recv(1024)print(data.decode('utf-8'))

client.close()

效果如下图所示

1881736-20191209014714218-690311779.png

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

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

1881736-20191209015142109-290217296.png

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

1881736-20191209015558395-1300889934.png

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

1881736-20191209025034820-478198998.png

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

1881736-20191209030018961-1020545084.png

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

1881736-20191209032418867-1010475806.png

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

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

1881736-20191209173403921-1049432737.png

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语言水平太差,只能作罢。

1881736-20191209180635252-181821368.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值