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

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

时间:2019-12-02 23:43:25      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:服务   启动   header   结果   bin   详细   cep   bre   and   

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)
    #监听端口,是否有请求
    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-8

from socket import *

HOST = "192.168.8.188"
# HOST = "127.0.0.1"
PORT = 2345
ADDR = (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之间的关系

标签:服务   启动   header   结果   bin   详细   cep   bre   and   

原文地址:https://www.cnblogs.com/Alexkk/p/11973302.html

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