socket — 저수준 네트워킹 인터페이스
socket — 저수준 네트워킹 인터페이스
소스 코드: Lib/socket.py
이 모듈은 BSD 소켓 인터페이스에 대한 접근을 제공합니다. 모든 최신 Unix 시스템, Windows, macOS 및 기타 플랫폼에서 사용할 수 있습니다.
본문
소켓은 네트워크 통신의 엔드포인트입니다. socket 모듈은 소켓을 만들고, 연결하고, 데이터를 보내고 받는 함수를 제공합니다.
소켓 만들기
소켓은 socket.socket()으로 만듭니다.
import socket
# Create an IPv4 TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind to an address
sock.bind(('localhost', 8080))
# Listen for connections
sock.listen()
# Accept a connection
conn, addr = sock.accept()
# Send and receive data
conn.send(b'Hello')
data = conn.recv(1024)
# Close
conn.close()
클라이언트 측:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8080))
sock.sendall(b'Hello server')
data = sock.recv(1024)
sock.close()
모듈 함수
- socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) — 새 소켓을 만듭니다.
- socket.socketpair(family=AF_UNIX, type=SOCK_STREAM, proto=0) — 연결된 소켓 쌍을 만듭니다.
- *socket.create_connection(address, timeout=None, source_address=None, , all_errors=False) — 주소로 연결.
- *socket.create_server(address, , family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) — 연결을 받는 서버 소켓을 만듭니다.
- socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) — 호스트를 주소 정보 목록으로 변환합니다.
- socket.getfqdn([name]) — 호스트의 완전한 도메인 이름을 반환합니다.
- socket.gethostbyname(hostname) — 호스트 이름을 IPv4 주소로 변환합니다.
- socket.gethostbyname_ex(hostname) — 호스트의 주소 정보를 확장 형식으로 반환합니다.
- socket.gethostname() — 현재 호스트 이름을 반환합니다.
- socket.getnameinfo(sockaddr, flags) — 소켓 주소를 호스트 이름으로 변환합니다.
- socket.getprotobyname(protocolname) — 프로토콜 이름을 프로토콜 번호로 변환합니다.
- socket.getservbyname(servicename[, protocolname]) — 서비스 이름을 포트 번호로 변환합니다.
- socket.htonl(x) — 32비트 정수를 네트워크 바이트 순서로 변환합니다.
- socket.htons(x) — 16비트 정수를 네트워크 바이트 순서로 변환합니다.
- socket.inet_aton(ip_string) — IPv4 주소 문자열을 4바이트로 변환합니다.
- socket.inet_ntoa(packed_ip) — 4바이트를 IPv4 주소 문자열로 변환합니다.
- socket.inet_pton(address_family, ip_string) — IP 주소 문자열을 패킹된 이진 형식으로 변환합니다.
- socket.inet_ntop(address_family, packed_ip) — 패킹된 이진 IP 주소를 문자열로 변환합니다.
- socket.ntohl(x) — 네트워크 바이트 순서의 32비트 정수를 호스트 순서로 변환합니다.
- socket.ntohs(x) — 네트워크 바이트 순서의 16비트 정수를 호스트 순서로 변환합니다.
- socket.setdefaulttimeout(timeout) — 소켓 연산의 기본 타임아웃을 설정합니다.
- socket.getdefaulttimeout() — 기본 타임아웃을 반환합니다.
- socket.sethostname(name) — 호스트 이름을 설정합니다.
소켓 객체 메서드
socket()이 반환하는 소켓 객체는 다음과 같은 주요 메서드를 가집니다.
- accept() — 연결을 수락하고
(conn, address)를 반환합니다. - bind(address) — 소켓에 주소를 바인딩합니다.
- close() — 소켓을 닫습니다.
- connect(address) — 원격 주소에 연결합니다.
- connect_ex(address) —
connect()와 같지만 오류를 반환 코드로 반환합니다. - fileno() — 소켓의 파일 디스크립터를 반환합니다.
- getpeername() — 원격 주소를 반환합니다.
- getsockname() — 소켓의 자체 주소를 반환합니다.
- getsockopt(level, optname) — 소켓 옵션 값을 반환합니다.
- listen([backlog]) — 연결 수신을 시작합니다.
- *makefile(mode='r', buffering=None, , encoding=None, errors=None, newline=None) — 소켓과 연결된 파일 객체를 반환합니다.
- recv(bufsize[, flags]) — 소켓에서 데이터를 받습니다.
- recvfrom(bufsize[, flags]) — 소켓에서 데이터를 받고 주소를 반환합니다.
- recv_into(buffer[, nbytes[, flags]]) — 버퍼로 데이터를 받습니다.
- recvmsg(bufsize[, ancbufsize[, flags]]) — 데이터와 보조 데이터를 받습니다.
- send(bytes[, flags]) — 소켓으로 데이터를 보냅니다.
- sendall(bytes[, flags]) — 모든 데이터를 보냅니다.
- sendto(bytes, address) — 데이터를 특정 주소로 보냅니다.
- setblocking(flag) — 소켓의 블로킹 모드를 설정합니다.
- settimeout(value) — 소켓 연산의 타임아웃을 설정합니다.
- setsockopt(level, optname, value) — 소켓 옵션 값을 설정합니다.
- shutdown(how) — 소켓의 일부 또는 전체를 종료합니다.
주소 패밀리와 소켓 타입
- socket.AF_INET — IPv4 주소 패밀리.
- socket.AF_INET6 — IPv6 주소 패밀리.
- socket.AF_UNIX — Unix 도메인 소켓.
- socket.SOCK_STREAM — 연결 지향 스트림 소켓(TCP).
- socket.SOCK_DGRAM — 데이터그램 소켓(UDP).
- socket.SOCK_RAW — 원시 소켓.
- socket.SOCK_SEQPACKET — 순차 패킷 소켓.
상수
- socket.SOL_SOCKET — 소켓 수준 옵션.
- socket.SO_REUSEADDR — 주소 재사용 옵션.
- socket.SO_KEEPALIVE — keepalive 옵션.
- socket.SO_SNDBUF — 송신 버퍼 크기.
- socket.SO_RCVBUF — 수신 버퍼 크기.
- socket.TCP_NODELAY — Nagle 알고리즘 비활성화.
- socket.IPPROTO_TCP — TCP 프로토콜.
- socket.IPPROTO_UDP — UDP 프로토콜.
예제: 웹 서버
간단한 에코 서버:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('localhost', 12345))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)