Python socket 라 이브 러 리 네트워크 통신 소켓 실현

소켓 소켓:통신 점 안내
socket 은 유 닉 스에 서 기원 되 었 고 유 닉 스/리 눅 스 의 기본 철학 중 하 나 는'모든 파일'입 니 다.파일 에 대해 서 는[열기][읽 기 쓰기][닫 기]모드 로 작 동 합 니 다.socket 은 이 모드 의 실현 입 니 다.socket 은 특수 한 파일 입 니 다.일부 socket 함 수 는 이 를 조작 하 는 것 입 니 다(읽 기/쓰기 IO,열기,닫 기).
Socket 은 모든 컴퓨터 네트워크 통신 에서 가장 기본 적 인 내용 이다.Socket 통신 일반 사용자 C/S 구조 시스템 의 네트워크 통신.
Socket 네트워크 통신 은 TCP(전송 제어 프로 토 콜)나 UDP(사용자 데이터 보고 프로 토 콜)두 가지 프로 토 콜 을 바탕 으로 하 는 통신 이기 때문에 연결(TCP)과 연결 되 지 않 은(UDP)두 가지 통신 방식 이 있다.
Python 이 TCP 소켓 을 만 들 려 면 생 성 할 때 소켓 형식 을 SOCK 로 지정 해 야 합 니 다.STREAM,TCP/IP 통신 프로 토 콜 을 사용 합 니 다.
소켓 네트워크 통신 소켓
socket 라 이브 러 리 는 BSD 소켓 인터페이스 로 네트워크 통신 을 할 수 있 는 바 텀 C API 를 제공 합 니 다.이 는 socket 류 를 포함 하여 구체 적 인 데이터 채널 을 처리 하 는 데 사용 되 며,네트워크 관련 작업 을 수행 하 는 함수 도 포함 되 어 있 습 니 다.예 를 들 어 서버 이름 을 하나의 주소 로 변환 하고 데 이 터 를 포맷 하여 네트워크 에서 보 낼 수 있 습 니 다.
소켓 이란 무엇 입 니까?
소켓 은 프로그램 이 로 컬 이나 인터넷 을 통 해 데 이 터 를 전달 할 때 사용 하 는 통신 채널 의 한 점 이다.
소켓 은 데 이 터 를 어떻게 보 내 는 지 제어 하 는 데 사용 되 는 두 가지 주요 속성 이 있 습 니 다.주소 클 러 스 터(address family)제어 에 사용 되 는 OSI 네트워크 계층 프로 토 콜 입 니 다.소켓 형식(socket type)전송 계층 프로 토 콜 을 제어 합 니 다.(7 층 프로 토 콜 참조)
주소 클 러 스 터
Python 은 3 개의 주소 클 러 스 터 를 지원 합 니 다:
  • AF_INET:IPv 4 주소 지정 에 사용 합 니 다.IPv 4 길 이 는 4 개의 바이트 로 보통 4 개의 수의 서열 을 나타 내 고 각 바이트 마다 하나의 수 에 대응 하 며 점 번호 로 분할(예 를 들 어 121.63.0.243)한다.이 값 들 은 보통 IP 주소 라 고 불 린 다.현재 IPv 4 는 여전히 주류 다
  • AF_INET 6:IPv 6 주소 지정 에 사용 합 니 다.현재 IPv 6 는 128 비트 주소 와 통신 흐름 조정 을 지원 하고 IPv 4 가 지원 하지 않 는 일부 경로 특성 도 지원 합 니 다
  • AF_UNIX:UNIX 도 메 인 소켓(UDS)에 사용 할 주소 클 러 스 터 입 니 다.이것 은 POSIX 호 환 시스템 의 프로 세 스 간 통신 프로 토 콜 입 니 다.UDS 의 실현 은 네트워크 스 택 대신 운영 체제 가 프로 세 스 간 에 데 이 터 를 직접 전달 할 수 있 도록 합 니 다.이것 은 AF 를 사용 하 는 것 보다INET 는 더욱 효율 적 이지 만 파일 시스템 을 주소 지정 명령 공간 으로 사용 해 야 하기 때문에 UDS 는 같은 시스템 의 프로 세 스 에 만 국한 된다
  • 소켓 형식
    소켓 형식 은 두 가지 가 있 습 니 다.
  • SOCK_DGRAM:메 시 지 를 위 한 데이터 신문 전송,데이터 신문 소켓 은 보통 UDP 와 연 결 됩 니 다.즉,사용자 데이터 신문 프로 토 콜 입 니 다.이 소켓 들 은 믿 을 수 없 는 소식 전송 을 제공 할 수 있다
  • SOCK_STREAM:흐름 을 위 한 전송,TCP 와 관련 된 전송 제어 프로 토 콜.이들 은 클 라 이언 트 와 서버 사이 에 바이트 흐름 을 제공 할 수 있 으 며,시간 초과 관리,재 전송 및 기타 특성 을 통 해 메시지 전송 또는 실패 알림 을 확보 할 수 있 습 니 다
  • 대부분의 응용 프로 토 콜(예 를 들 어 HTTP)은 TCP 를 바탕 으로 합 니 다.메시지 정렬 과 전송 을 자동 으로 처리 하 는 복잡 한 응용 프로그램 을 만 들 기 쉽 기 때 문 입 니 다.
    UDP 는 보통 순서 가 중요 하지 않 은 프로 토 콜(예 를 들 어 DNS 교환)에 사 용 됩 니 다.UDP 와 TCP 는 IPv 4 와 IPv 6 를 지원 합 니 다.
    소켓 의 간단 한 응용
    gethostbyname_ex()와 gethostby name()
    socket 라 이브 러 리 는 네트워크 에 있 는 도 메 인 네 임 서비스 와 상호작용 하 는 함 수 를 포함 합 니 다.예 를 들 어 도 메 인 이름 을 IP 주소 로 해석 하면 gethostby name 을 사용 할 수 있 습 니 다.ex(),예 는 다음 과 같다.
    
    import socket
    
    host_str = [
        'www.baidu.com',
        'cloud.tencent.com',
        'www.csdn.net'
    ]
    for host in host_str:
        try:
            name, aliases, addresses = socket.gethostbyname_ex(host)
            print(host)
            print("   :", name)
            print("    :", aliases)
            print("    IP  :", addresses)
        except socket.error as msg:
            print(host, msg)
    실행 후 효 과 는 다음 과 같 습 니 다.
    别名
    gethostbyname_ex:이 함 수 는 3 개의 인자,호스트 이름,별명,그리고 현재 호스트 로 이동 할 수 있 는 IP 주 소 를 분석 합 니 다.
    gethostby name:유사 한 함수 로 현재 호스트 의 IP 주소 만 되 돌려 줍 니 다.
    getservby name()과 getservby port()
    socket 라 이브 러 리 는 getservbyname()함 수 를 제공 하여 네트워크 서비스의 포트 번호 와 표준 이름 을 찾 습 니 다.예 를 들 어 다음 과 같 습 니 다.
    
    import socket
    from urllib.parse import urlparse
    
    url_str = [
        'https://www.baidu.com',
        'https://www.csdn.net',
        'smtp://smtp.qq.com',
    ]
    for url in url_str:
        try:
            parsed_url = urlparse(url)
            port = socket.getservbyname(parsed_url.scheme)
            print(url)
            print("   :", port)
        except socket.error as msg:
            print(url, msg)
    실행 후 효 과 는 다음 과 같 습 니 다.
    端口号
    물론 가장 유용 한 것 은 링크 를 지정 하여 포트 번 호 를 조회 하 는 것 이 아니 라 역방향 조작 이다.표준화 서비스 포트 번 호 는 일반적으로 고정 되 어 있 기 때문이다)
    socket 라 이브 러 리 는 getservby port()함 수 를 제공 하여 역방향 서비스 포트 찾기 를 완성 합 니 다.예제 코드 는 다음 과 같 습 니 다.
    
    import socket
    
    url = '{}://smtp.qq.com'.format(socket.getservbyport(25))
    print(url)
    실행 후 효 과 는 다음 과 같 습 니 다.
    逆向端口号
    getprotobyname()
    socket 라 이브 러 리 는 getprotoby name()함수 로 전송 프로 토 콜 에 분 배 된 포트 번 호 를 가 져 올 수 있 습 니 다.예 를 들 어 다음 과 같 습 니 다.
    
    import socket
    
    #               
    def getConstants(prefix):
        return {
            getattr(socket, n): n
            for n in dir(socket)
            if n.startswith(prefix)
        }
    ipproto_str = getConstants("IPPROTO_")
    for agree in ['tcp', 'udp']:
        num = socket.getprotobyname(agree)
        name = ipproto_str[num]
        print(name, num)
    실행 후 효 과 는 다음 과 같 습 니 다.
    示例如上
    프로 토 콜 코드 에 대해 프로그램 정의 에 서 는 일반적으로 표준화 상수 입 니 다.이것 은 상수 명 은 모두 일정한 규칙 이 있 고 socket 프로 토 콜 코드 접 두 사 는 IPproto 임 을 의미 합 니 다.
    getaddrinfo(서버 주소 찾기)
    getaddrinfo()함 수 는 서비스의 기본 주 소 를 원 그룹 목록 으로 변환 하 는 데 사 용 됩 니 다.연결 을 만 드 는 데 필요 한 모든 정 보 를 포함 합 니 다.예 를 들 어 네트워크 클 러 스 터 와 프로 토 콜 등 은 다음 과 같다.
    
    import socket
    
    #                
    def getConstants(prefix):
        return {
            getattr(socket, n): n
            for n in dir(socket)
            if n.startswith(prefix)
        }
    ipproto_str = getConstants("IPPROTO_")
    family_str = getConstants("AF_")
    type_str = getConstants("SOCK_")
    for response in socket.getaddrinfo('www.csdn.net', 'http', family=socket.AF_INET, type=socket.SOCK_STREAM,
                                       proto=socket.IPPROTO_TCP, flags=socket.AI_CANONNAME):
        family, socktype, ipproto, canonname, sockaddr = response
        print("   :       ", family_str[family])
        print("     :    ", type_str[socktype])
        print("   :       ", ipproto_str[ipproto])
        print("     :    ", canonname)
        print("ip      :", sockaddr)
    실행 후 효 과 는 다음 과 같 습 니 다.
    筛选条件
    여기에 socket.getaddrinfo('www.csdn.net','http')만 사용 하면 연결 정 보 를 걸 러 낼 필요 가 없다 는 뜻 이지 만 대형 사 이 트 는 보통 몇 개의 IP 나 도 메 인 이름 이 홈 페이지 로 넘 어 갑 니 다.
    따라서 뒤의 매개 변 수 를 통 해 자신 이 필요 로 하 는 링크 정 보 를 선별 할 수 있 습 니 다.
    그 중 마지막 매개 변수 socket.AICANONNAME 은 호스트 에 별명 이 있 으 면 서버 의 표준 이름 이 포 함 될 것 이 라 고 밝 혔 다.이 표지 가 없 으 면 표준 이름 이 비어 있 습 니 다.
    IP 주소 표시 방식
    독자 가 C 의 경험 이 있다 면 C 언어 를 통 해 작 성 된 소켓 프로그램 은 struct sockaddr 구조 체 를 사용 하고 IP 주 소 를 위 에 표 시 된 Python 문자열 형식 이 아 닌 바 이 너 리 로 표시 한 다 는 것 을 알 것 입 니 다.
    Python 과 C 사이 에서 IPv 4 주 소 를 바 꾸 려 면 inet 를 사용 하 십시오.aton()과 inetntoa()。예 는 다음 과 같다.
    
    import socket
    import binascii
    
    ip_list = [
        "192.168.50.1",
        "127.0.0.1"
    ]
    for ip in ip_list:
        packed = socket.inet_aton(ip)
        print("     ip  :", ip)
        print("C     ip  ", binascii.hexlify(packed))
        print("  C ip     ", socket.inet_ntoa(packed))
        print()
    실행 후 효 과 는 다음 과 같 습 니 다.
    效果图
    inet_pton()과 inetntop()
    독자 가 테스트 위 에 코드 를 입력 하면 inetaton()함수 일 때 알림 에 inet 가 있 는 것 을 볼 수 있 습 니 다.pton()과 inetntop()함수.
    이 두 함 수 는 IPv 4 도 처리 할 수 있 고 IPv 6 도 처리 할 수 있 으 며 inetaton()과 inetntoa()는 IPv 4 만 처리 할 수 있 습 니 다.그것들의 사용 방식 은 다음 과 같다.
    
    import socket
    import binascii
    
    ipv6_str = "2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b"
    packed = socket.inet_pton(socket.AF_INET6, ipv6_str)
    print("     ip  :", ipv6_str)
    print("C     ip  ", binascii.hexlify(packed))
    print("  C ip     ", socket.inet_ntop(socket.AF_INET6, packed))
    print()
    
    ipv4_str = "192.168.50.1"
    packed = socket.inet_pton(socket.AF_INET, ipv4_str)
    print("     ip  :", ipv4_str)
    print("C     ip  ", binascii.hexlify(packed))
    print("  C ip     ", socket.inet_ntop(socket.AF_INET, packed))
    print()
    실행 후 효 과 는 다음 과 같 습 니 다.
    IPV6
    이상 은 Python 이 socket 라 이브 러 리 네트워크 통신 소켓 을 실현 하 는 상세 한 내용 입 니 다.Python socket 라 이브 러 리 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기