码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-12-09 19:28:35      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:tar   linu   lock   实验环境   标记   包含   star   error:   connect   

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

技术图片

 

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

标签:tar   linu   lock   实验环境   标记   包含   star   error:   connect   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!