python Socket编程-python API 与 Linux Socket API之间的关系,,python soc
python Socket编程-python API 与 Linux Socket API之间的关系,,python soc
python socket编程
服务端
#!/usr/bin/env python# coding=utf-8from socket import *HOST = ''PORT = 2345BUFSIZE = 1024ADDR = (HOST,PORT)#创建AF_INET地址族,TCP的套接字with socket(AF_INET,SOCK_STREAM) as tcpSerSock: #绑定ip和端口 tcpSerSock.bind(ADDR) #监听端口,是否有请求 tcpSerSock.listen(5) while True: print("waiting for connect!!") #accept() 是阻塞的 tcpClientSock,addr = tcpSerSock.accept() print("the client: ",addr,"is connecting") with tcpClientSock: #使用一个while循环,持续和客户端通信,直到客户端断开连接或者崩溃 while True: data = tcpClientSock.recv(BUFSIZE) #判断客户端是否断开连接 if not data: break; print("client: ",data.decode("utf-8")) #相应客户端请求 msg = input("server: ") tcpClientSock.sendall(msg.encode("utf-8")) #客户端退出 print("client ",addr,"exit!")
客户端
#!/usr/bin/env python# coding=utf-8from socket import *HOST = "192.168.8.188"# HOST = "127.0.0.1"PORT = 2345ADDR = (HOST,PORT)with socket(AF_INET,SOCK_STREAM) as tcpCliSock: tcpCliSock.connect(ADDR) with tcpCliSock: while True: msg = input("client:") tcpCliSock.sendall(msg.encode('utf-8')) data=tcpCliSock.recv(1024) if not data: break print("server: ",data.decode("utf-8")) print("server crash")
启动服务器进程和客户端进程
python server.py
python client.py
通信结果如下:
netstat
netstat 查看 socket 及其状态的信息
如下结果可以看到客户端进程和服务器进程通过tcp建立连接
isof
isof 命令使用 -i 参数可以查看打开的 socket 连接的 COMMAND, PID(process id) 和 USER(user id),下面的输出就是打印客户端的连接信息,可以通过man lsof,查看详细信息
tcpdump
tcpdump抓包分析,因为有一个端口号是2345,所以tcpdump的一个参数就可以设为端口号,详细的参数可自行百度
tcpdump 抓包只能看到端口号,如上图是符合通信过程的。
对比python socket API 和 linux socket API
使用strace命令跟踪对比发现,python的API就是对Linux的API进行封装。
strace python ./client.py
Python | Linux |
---|---|
socket(AF_INET,SOCK_STREAM) | socket(PF_INET,SOCK_STREAM,IPPRPTO_IP)=3 |
bind((host,port)) | bind(3,{sa_family=AF_INET,sin_port=htons(2345),sin_addr("0.0.0.0")},16)=0 |
accept() | accept(3,{sa_family=AF_INET,sin_port=htons(2345),sin_addr("192.168.8.xx)},[16]))=4 |
recv(BUFERSIZE) | recvfrom(4,buf_address,lenth,0,NULL,NULL) |
sendall(msg.encode("utf-8)) | sendto(4,msg,sizeof(msg),0,NULL,0) |
connect((host,port)) | connect(3,{sa_family=AF_INET,sin_port=htons(2345),sin_addr("192.168.8.xx)},[16]))=4 |
表格中的3 ,4表示文件描述符,熟悉linux系统的朋友对文件描述符想必不会陌生,但可以注意到服务器进程产生了两个文件描述符,先是一个3,对应socket创建,而后accept之后,又产生了一个文件描述符4,对应客户端;而客户端始终只有一个3,对应当前连接,可以看到二者的文件描述符是无必然相等关系的。
python Socket编程-python API 与 Linux Socket API之间的关系
相关内容
- python实现一个简单的网络聊天程序,,一、Linux So
- python机器学习——感知器,,最近在看机器学习相关
- Python-网络编程,python网络编程基础,一、使用python
- python学习之-迭代器,,什么是迭代器什么是迭
- 利用Python进行数据分析 第6章 数据加载、存储与文件格
- 《python解释器源码剖析》第3章--python中的字符串对象,
- python xlsxwriter库生成图表的应用,python怎么生成图表,
- Python 操作 GA API 指南,好男人指南手册,因为需要写一个
- python列表,python键盘输入列表,列表: 列表的功能
- 04-python 学习第四点-装饰器,,装饰器就是一个函数,
评论关闭