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 개의 주소 클 러 스 터 를 지원 합 니 다:
소켓 형식 은 두 가지 가 있 습 니 다.
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()
실행 후 효 과 는 다음 과 같 습 니 다.이상 은 Python 이 socket 라 이브 러 리 네트워크 통신 소켓 을 실현 하 는 상세 한 내용 입 니 다.Python socket 라 이브 러 리 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.