socket — 저수준 네트워킹 인터페이스

socket — 저수준 네트워킹 인터페이스

소스 코드: Lib/socket.py

이 모듈은 BSD 소켓 인터페이스에 대한 접근을 제공합니다. 모든 최신 Unix 시스템, Windows, macOS 및 기타 플랫폼에서 사용할 수 있습니다.

출처: Python documentation

본문

소켓은 네트워크 통신의 엔드포인트입니다. 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)

더 알아보기 (Learn more)