-python API 및 Linux 소켓 API 프로그래밍 파이썬 소켓 사이의 관계

파이썬 소켓 프로그래밍

서버

#!/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는 소켓 정보의 상태를 볼
당신은 TCP를 통해 연결을 설정하는 클라이언트 프로세스와 서버 프로세스의 결과를 볼 수

isof

COMMAND는, PID (프로세스 ID) 및 USER (사용자 ID), -i 명령 isof 다음과 같은 출력 매개 변수가 열린 소켓 연결이 남자 lsof를하여 클라이언트의 인쇄 정보에 연결되어 볼 수 있습니다, 세부 사항을 볼

tcpdump를

tcpdump와 매개 변수가 포트 번호를 설정할 수 있도록 포트 번호가 2345이고 있기 때문에, 상세한 파라미터 자체 바이 수 있으며, 패킷 캡쳐 tcpdump을

통신 과정도 함께 라인에 상기 tcpdump를 캡처 포트 번호는 알 수있다.

대비 파이썬 소켓 API 및 리눅스 소켓 API

사용의 strace 명령 흔적 비교 파이썬의 API는 리눅스 패키지의 API입니다 발견했다.
strace python ./client.py

파이썬 리눅스
소켓 (AF_INET, SOCK_STREAM) 소켓 (PF_INET, SOCK_STREAM, IPPRPTO_IP) = 3
바인딩 ((호스트 포트)) 바인딩 (3 인 sa_family = {AF_INET, sin_port = htons (2345), sin_addr ( "0.0.0.0")}, 16) = 0
() 동의 수락 (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)
모두 발송 (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,对应当前连接,可以看到二者的文件描述符是无必然相等关系的。

추천

출처www.cnblogs.com/Alexkk/p/11973302.html