이 문서는 더는 지원되지 않는 이전 버전의 파이썬 용입니다. 업그레이드하고, 다음 설명서를 읽어야 합니다: 현재 안정 버전에 대한 파이썬 설명서.

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

소스 코드: Lib/socket.py

이 모듈은 BSD socket 인터페이스에 대한 액세스를 제공합니다. 모든 현대 유닉스 시스템, 윈도우, MacOS, 그리고 아마 추가 플랫폼에서 사용할 수 있습니다.

참고

호출이 운영 체제 소켓 API로 이루어지기 때문에, 일부 동작은 플랫폼에 따라 다를 수 있습니다.

파이썬 인터페이스는 유닉스 시스템 호출과 소켓을 위한 라이브러리 인터페이스를 파이썬의 객체 지향 스타일로 직역한 것입니다: `socket()` 함수는 소켓 객체 (socket object)를 반환하고, 이것의 메서드는 다양한 소켓 시스템 호출을 구현합니다. 매개 변수 형은 C 인터페이스보다 다소 고수준입니다: 파이썬 파일에 대한 `read()` 와 `write()` 연산처럼, 수신 연산의 버퍼 할당은 자동이고 전송 연산에서 버퍼 길이는 묵시적입니다.

더 보기

모듈 `socketserver`

  네트워크 서버 작성을 단순화하는 클래스.

모듈 `ssl`

  소켓 객체용 TLS/SSL 래퍼.

## 소켓 패밀리

시스템과 빌드 옵션에 따라, 다양한 소켓 패밀리가 이 모듈에서 지원됩니다.

특정 소켓 객체가 요구하는 주소 형식은 소켓 객체를 만들 때 지정된 주소 패밀리에 따라 자동으로 선택됩니다. 소켓 주소는 다음과 같이 표현됩니다:

- 파일 시스템 노드에 바인드 된 `AF_UNIX` 소켓의 주소는 파일 시스템 인코딩과 `'surrogateescape'` 에러 처리기(PEP 383을 참조하세요)를 사용하는 문자열로 표현됩니다. 리눅스의 추상 이름 공간(abstract namespace)에 있는 주소는 처음에 널 바이트가 있는 바이트열류 객체로 반환됩니다; 이 이름 공간의 소켓은 일반 파일 시스템 소켓과 통신 할 수 있으므로, 리눅스에서 실행하려는 프로그램은 두 가지 유형의 주소를 모두 다뤄야 할 수도 있습니다. 문자열이나 바이트열류 객체는 인자로 전달할 때 두 가지 유형의 주소에 모두 사용할 수 있습니다.

  > 버전 3.3에서 변경: 이전에는, `AF_UNIX` 소켓 경로가 UTF-8 인코딩을 사용한다고 가정했습니다.

  > 버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.

- 쌍 `(host, port)`가 `AF_INET` 주소 패밀리에 사용됩니다. 여기서 host는 `'daring.cwi.nl'`과 같은 인터넷 도메인 표기법의 호스트 명이나 `'100.50.200.5'`와 같은 IPv4 주소를 나타내는 문자열이고, port는 정수입니다.

  - IPv4 주소의 경우, 호스트 주소 대신 두 개의 특수 형식이 허용됩니다: `''`는 모든 인터페이스에 바인딩하는 데 사용되는 `INADDR_ANY`를 나타내며 `'<broadcast>'` 문자열은 `INADDR_BROADCAST`를 나타냅니다. 이 동작은 IPv6와 호환되지 않으므로, 여러분의 파이썬 프로그램에서 IPv6를 지원하려는 경우에는 이것들을 사용하지 않을 수 있습니다.

- `AF_INET6` 주소 패밀리의 경우, 4-튜플 `(host, port, flowinfo, scopeid)`가 사용됩니다. 여기서 flowinfo 와 scopeid는 C에서 `struct sockaddr_in6`의 `sin6_flowinfo` 와 `sin6_scope_id` 멤버를 나타냅니다. `socket` 모듈 메서드의 경우, flowinfo 와 scopeid는 이전 버전과의 호환성을 위해 생략할 수 있습니다. 그러나, scopeid를 생략하면 스코프가 지정된(scoped) IPv6 주소를 조작하는 데 문제가 발생할 수 있습니다.

  버전 3.7에서 변경: 멀티캐스트 주소(의미 있는 scopeid를 가진)의 경우, address에는 `%scope` (또는 `zone id`) 부분이 포함될 수 없습니다. 이 정보는 불필요하므로 안전하게 생략할 수 있습니다 (권장 사항).

- `AF_NETLINK` 소켓은 `(pid, groups)` 쌍으로 표현됩니다.

- TIPC에 대한 리눅스 전용 지원은 `AF_TIPC` 주소 패밀리를 사용하여 사용할 수 있습니다. TIPC는 클러스터 된 컴퓨터 환경에서 사용하도록 설계된 개방형 비 IP 기반 네트워크 프로토콜입니다. 주소는 튜플로 표현되며 필드는 주소 유형에 따라 다릅니다. 일반적인 튜플 형식은 `(addr_type, v1, v2, v3 [, scope])`입니다. 이때:

  - addr_type은 `TIPC_ADDR_NAMESEQ`, `TIPC_ADDR_NAME` 또는 `TIPC_ADDR_ID` 중 하나입니다.

  - scope는 `TIPC_ZONE_SCOPE`, `TIPC_CLUSTER_SCOPE` 또는 `TIPC_NODE_SCOPE` 중 하나입니다.

  - addr_type이 `TIPC_ADDR_NAME`이면, v1은 서버 유형이고, v2는 포트 식별자이며, v3은 0이어야 합니다.

    addr_type이 `TIPC_ADDR_NAMESEQ`면, v1은 서버 유형이고, v2는 하위 포트 번호이며, v3는 상위 포트 번호입니다.

    addr_type이 `TIPC_ADDR_ID`면, v1은 노드이고, v2는 참조이며, v3는 0으로 설정되어야 합니다.

- 튜플 `(interface, )`가 `AF_CAN` 주소 패밀리에 사용됩니다. 여기서 interface는 `'can0'`과 같은 네트워크 인터페이스 이름을 나타내는 문자열입니다. 네트워크 인터페이스 이름 `''`는 이 패밀리의 모든 네트워크 인터페이스에서 패킷을 수신하는 데 사용할 수 있습니다.

  - `CAN_ISOTP` 프로토콜은 튜플 `(interface, rx_addr, tx_addr)`를 요구하는데, 두 개의 추가 매개 변수는 모두 CAN 식별자(표준 또는 확장)를 나타내는 부호 없는 long 정수입니다.

- 문자열이나 튜플 `(id, unit)`는 `PF_SYSTEM` 패밀리의 `SYSPROTO_CONTROL` 프로토콜에 사용됩니다. 문자열은 동적으로 할당된 ID를 사용하는 커널 컨트롤의 이름입니다. 튜플은 커널 컨트롤의 ID와 유닛 번호가 알려져 있거나 등록된 ID가 사용될 때 사용할 수 있습니다.

  버전 3.3에 추가.

- `AF_BLUETOOTH`는 다음 프로토콜 및 주소 형식을 지원합니다:

  - `BTPROTO_L2CAP`는 `(bdaddr, psm)`를 받아들입니다. 여기서 `bdaddr`은 문자열 블루투스 주소이고 `psm`은 정수입니다.

  - `BTPROTO_RFCOMM`은 `(bdaddr, channel)`를 받아들입니다. 여기서 `bdaddr`은 문자열 블루투스 주소이고 `channel`은 정수입니다.

  - `BTPROTO_HCI`는 `(device_id,)`를 받아들입니다. 여기서 `device_id`는 정수나 인터페이스의 블루투스 주소인 문자열입니다. (이것은 여러분의 OS에 따라 다릅니다; NetBSD와 FreeBSD는 블루투스 주소를 기대하지만 다른 모든 것은 정수를 기대합니다.)

    버전 3.2에서 변경: NetBSD 및 DragonFlyBSD 지원이 추가되었습니다.

  - `BTPROTO_SCO`는 `bdaddr`를 받아들입니다. 여기서 `bdaddr`는 블루투스 주소의 문자열 형식이 포함된 `bytes` 객체입니다. (예, `b'12:23:34:45:56:67'`) 이 프로토콜은 FreeBSD에서 지원되지 않습니다.

- `AF_ALG`는 커널 암호 인터페이스에 기반한 리눅스 전용 소켓입니다. 알고리즘 소켓은 2~4개의 요소를 갖는 `(type, name [, feat [, mask]])` 튜플로 구성됩니다. 여기서:

  - type은 문자열의 알고리즘 유형입니다, 예를 들어, `aead`, `hash`, `skcipher` 또는 `rng`.

  - name은 알고리즘 이름과 연산 모드 문자열입니다, 예를 들어, `sha256`, `hmac(sha256)`, `cbc(aes)` 또는 `drbg_nopr_ctr_aes256`.

  - feat 과 mask는 부호 없는 32비트 정수입니다.

  Availability: Linux 2.6.38, some algorithm types require more recent Kernels.

  버전 3.6에 추가.

- `AF_VSOCK`은 가상 기계와 호스트가 통신할 수 있게 합니다. 소켓은 `(CID, port)` 튜플로 표현되는데, 컨텍스트 ID 또는 CID와 port는 정수입니다.

  Availability: Linux >= 4.8 QEMU >= 2.8 ESX >= 4.0 ESX Workstation >= 6.5.

  버전 3.7에 추가.

- `AF_PACKET`은 네트워크 장치에 직접 연결된 저수준 인터페이스입니다. 패킷은 튜플 `(ifname, proto[, pkttype[, hatype[, addr]]])`로 표현됩니다. 여기서:

  - ifname - 장치 이름을 지정하는 문자열

  - proto - 이더넷 프로토콜 번호를 지정하는 네트워크 바이트 순서 정수.

  - pkttype - 패킷 유형을 지정하는 선택적 정수.:

    - `PACKET_HOST` (기본값) - 로컬 호스트로 향하는 패킷.

    - `PACKET_BROADCAST` - 물리 계층 브로드캐스트 패킷.

    - `PACKET_MULTIHOST` - 물리 계층 멀티캐스트 주소로 전송된 패킷.

    - `PACKET_OTHERHOST` - 무차별 모드의 장치 관리자에 의해 포착된 다른 호스트로 향하는 패킷.

    - `PACKET_OUTGOING` - 패킷 소켓으로 루프 백 된 로컬 호스트에서 시작된 패킷.

  - hatype - ARP 하드웨어 주소 유형을 지정하는 선택적 정수.

  - addr - 하드웨어 물리 주소를 지정하는 선택적 바이트열류 객체, 해석은 장치에 따라 다릅니다.

IPv4/v6 소켓 주소의 host 부분에 호스트 명을 사용하면, 파이썬이 DNS 결정에서 반환된 첫 번째 주소를 사용하기 때문에, 프로그램은 비결정적인 동작을 보일 수 있습니다. 소켓 주소는 DNS 결정 결과 및/또는 호스트 구성에 따라 실제 IPv4/v6 주소로 다르게 결정됩니다. 결정론적 동작을 위해서는 host 부분에 숫자 주소를 사용하십시오.

모든 에러는 예외를 발생시킵니다. 잘못된 인자 형과 메모리 부족 조건에 대한 일반적인 예외가 발생할 수 있습니다. 파이썬 3.3부터, 소켓이나 주소 의미와 관련된 에러는 `OSError` 나 그 서브 클래스 중 하나를 발생시킵니다 (예전에는 `socket.error`를 발생시켰습니다).

비 블로킹 모드는 `setblocking()`을 통해 지원됩니다. 시간제한을 기반으로 하는 일반화는 `settimeout()`을 통해 지원됩니다.

## 모듈 내용

모듈 `socket`은 다음 요소를 노출합니다.

### 예외

exception `socket.``error`

  `OSError`의 폐지된 별칭.

  버전 3.3에서 변경: PEP 3151을 따라, 이 클래스는 `OSError`의 별칭이 되었습니다.

exception `socket.``herror`

  `OSError`의 서브 클래스, 이 예외는 주소 관련 에러에서 발생합니다. 즉 `gethostbyname_ex()`와 `gethostbyaddr()`를 포함하는 POSIX C API의 h_errno를 사용하는 함수들. 수반되는 값은 라이브러리 호출이 반환한 에러를 나타내는 `(h_errno, string)` 쌍입니다. h_errno는 숫자 값이고, string은 `hstrerror()` C 함수에 의해 반환된 h_errno의 설명을 나타냅니다.

  버전 3.3에서 변경: 이 클래스는 `OSError`의 서브 클래스가 되었습니다.

exception `socket.``gaierror`

  `OSError`의 서브 클래스, 이 예외는 `getaddrinfo()` 와 `getnameinfo()`에 의한 주소 관련 에러에서 발생합니다. 수반되는 값은 라이브러리 호출이 반환한 에러를 나타내는 `(error, string)` 쌍입니다. string은 `gai_strerror()` C 함수가 반환한 error의 설명을 나타냅니다. 숫자 error 값은 이 모듈에 정의된 `EAI_*` 상수 중 하나와 일치합니다.

  버전 3.3에서 변경: 이 클래스는 `OSError`의 서브 클래스가 되었습니다.

exception `socket.``timeout`

  `OSError`의 서브 클래스, 이 예외는 앞서 `settimeout()` 호출을 통해 (또는 묵시적으로 `setdefaulttimeout()`를 통해) 시간제한이 활성화된 소켓에서 시간 초과가 일어날 때 발생합니다. 수반되는 값은 현재는 항상 “timed out” 값을 갖는 문자열입니다.

  버전 3.3에서 변경: 이 클래스는 `OSError`의 서브 클래스가 되었습니다.

### 상수

> AF_* 와 SOCK_* 상수는 이제 `AddressFamily` 와 `SocketKind` `IntEnum` 컬렉션입니다.

> 버전 3.4에 추가.

`socket.``AF_UNIX`
`socket.``AF_INET`
`socket.``AF_INET6`

  이 상수는 `socket()`의 첫 번째 인자에 사용되는 주소 (및 프로토콜) 패밀리를 나타냅니다. `AF_UNIX` 상수가 정의되지 않으면 이 프로토콜은 지원되지 않습니다. 시스템에 따라 더 많은 상수를 사용할 수 있습니다.

`socket.``SOCK_STREAM`
`socket.``SOCK_DGRAM`
`socket.``SOCK_RAW`
`socket.``SOCK_RDM`
`socket.``SOCK_SEQPACKET`

  이 상수는 `socket()`의 두 번째 인자에 사용되는 소켓 유형을 나타냅니다. 시스템에 따라 더 많은 상수를 사용할 수 있습니다. (`SOCK_STREAM`과 `SOCK_DGRAM` 만 일반적으로 유용합니다.)

`socket.``SOCK_CLOEXEC`
`socket.``SOCK_NONBLOCK`

  이 두 상수는, 정의되었다면, 소켓 유형과 결합하여 일부 플래그를 원자 적으로 설정할 수 있도록 합니다 (따라서 경쟁 조건의 가능성과 별도 호출의 필요성을 피할 수 있습니다).

  더 보기

  좀 더 철저한 설명은 Secure File Descriptor Handling.

  가용성: 리눅스 >= 2.6.27.

  버전 3.2에 추가.

`SO_*`
`socket.``SOMAXCONN`
`MSG_*`
`SOL_*`
`SCM_*`
`IPPROTO_*`
`IPPORT_*`
`INADDR_*`
`IP_*`
`IPV6_*`
`EAI_*`
`AI_*`
`NI_*`
`TCP_*`

  소켓 및/또는 IP 프로토콜에 대한 유닉스 설명서에서 설명된 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다. 일반적으로 소켓 객체의 `setsockopt()` 와 `getsockopt()` 메서드 인자에 사용됩니다. 대부분 유닉스 헤더 파일에 정의된 기호만 정의됩니다; 몇 가지 기호는 기본값이 제공됩니다.

  버전 3.6에서 변경: `SO_DOMAIN`, `SO_PROTOCOL`, `SO_PEERSEC`, `SO_PASSSEC`, `TCP_USER_TIMEOUT`, `TCP_CONGESTION`가 추가되었습니다.

  버전 3.6.5에서 변경: 윈도우에서, 런타임 윈도우가 지원하면 `TCP_FASTOPEN`, `TCP_KEEPCNT`가 나타납니다.

  버전 3.7에서 변경: `TCP_NOTSENT_LOWAT`가 추가되었습니다.

  윈도우에서, 런타임 윈도우가 지원하면 `TCP_KEEPIDLE`, `TCP_KEEPINTVL`가 나타납니다.

`socket.``AF_CAN`
`socket.``PF_CAN`
`SOL_CAN_*`
`CAN_*`

  리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.

  가용성 : 리눅스 >= 2.6.25.

  버전 3.3에 추가.

`socket.``CAN_BCM`
`CAN_BCM_*`

  CAN 프로토콜 패밀리에서 CAN_BCM은 브로드캐스트 관리자 (Broadcast Manager, BCM) 프로토콜입니다. 리눅스 설명서에서 설명된 브로드캐스트 관리자 상수도 소켓 모듈에 정의되어 있습니다.

  가용성 : 리눅스 >= 2.6.25.

  버전 3.4에 추가.

`socket.``CAN_RAW_FD_FRAMES`

  CAN_RAW 소켓에서 CAN FD 지원을 활성화합니다. 기본적으로 비활성화되어 있습니다. 여러분의 응용 프로그램이 CAN과 CAN FD 프레임을 모두 보낼 수 있도록 합니다; 그러나 소켓에서 읽을 때 CAN과 CAN FD 프레임을 모두 받아들여야 합니다.

  이 상수는 리눅스 설명서에 설명되어 있습니다.

  가용성 : 리눅스 >= 3.6.

  버전 3.5에 추가.

`socket.``CAN_ISOTP`

  CAN 프로토콜 패밀리의 CAN_ISOTP는 ISO-TP (ISO 15765-2) 프로토콜입니다. ISO-TP 상수는 리눅스 설명서에 설명되어 있습니다.

  가용성 : 리눅스 >= 2.6.25.

  버전 3.7에 추가.

`socket.``AF_PACKET`
`socket.``PF_PACKET`
`PACKET_*`

  리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.

  가용성 : 리눅스 >= 2.2.

`socket.``AF_RDS`
`socket.``PF_RDS`
`socket.``SOL_RDS`
`RDS_*`

  리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.

  가용성 : 리눅스 >= 2.6.30.

  버전 3.3에 추가.

`socket.``SIO_RCVALL`
`socket.``SIO_KEEPALIVE_VALS`
`socket.``SIO_LOOPBACK_FAST_PATH`
`RCVALL_*`

  윈도우 WSAIoctl()용 상수. 이 상수는 소켓 객체의 `ioctl()` 메서드에 대한 인자로 사용됩니다.

  버전 3.6에서 변경: `SIO_LOOPBACK_FAST_PATH`가 추가되었습니다.

`TIPC_*`

  TIPC 관련 상수. C 소켓 API에서 내보낸 것과 일치합니다. 자세한 정보는 TIPC 설명서를 참조하십시오.

`socket.``AF_ALG`
`socket.``SOL_ALG`
`ALG_*`

  리눅스 커널 암호화용 상수.

  가용성 : 리눅스 >= 2.6.38.

  버전 3.6에 추가.

`socket.``AF_VSOCK`
`socket.``IOCTL_VM_SOCKETS_GET_LOCAL_CID`
`VMADDR*`
`SO_VM*`

  리눅스 호스트/게스트 통신용 상수.

  가용성 : 리눅스 >= 4.8.

  버전 3.7에 추가.

`socket.``AF_LINK`

  가용성 : BSD, OSX.

  버전 3.4에 추가.

`socket.``has_ipv6`

  이 상수는 이 플랫폼에서 IPv6가 지원되는지를 나타내는 논릿값을 포함합니다.

`socket.``BDADDR_ANY`
`socket.``BDADDR_LOCAL`

  이들은 특수한 의미를 지닌 블루투스 주소를 포함하는 문자열 상수입니다. 예를 들어, `BDADDR_ANY`는 바인딩 소켓을 `BTPROTO_RFCOMM`로 지정할 때 임의의(any) 주소를 나타내는 데 사용할 수 있습니다.

`socket.``HCI_FILTER`
`socket.``HCI_TIME_STAMP`
`socket.``HCI_DATA_DIR`

  `BTPROTO_HCI`와 함께 사용하십시오. NetBSD 나 DragonFlyBSD에서는 `HCI_FILTER`를 사용할 수 없습니다. `HCI_TIME_STAMP`와 `HCI_DATA_DIR`는 FreeBSD, NetBSD 또는 DragonFlyBSD에서 사용할 수 없습니다.

### 함수

#### 소켓 만들기

다음 함수는 모두 소켓 객체를 만듭니다.

`socket.``socket`(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

  지정된 주소 패밀리, 소켓 유형, 및 프로토콜 번호를 사용하여 새로운 소켓을 만듭니다. 주소 패밀리는 `AF_INET` (기본값), `AF_INET6`, `AF_UNIX`, `AF_CAN`, `AF_PACKET` 또는 `AF_RDS` 여야 합니다. 소켓 유형은 `SOCK_STREAM` (기본값), `SOCK_DGRAM`, `SOCK_RAW` 또는 기타 `SOCK_` 상수 중 하나여야 합니다. 프로토콜 번호는 일반적으로 0이며 생략될 수도 있고, 주소 패밀리가 `AF_CAN` 일 때 프로토콜은 `CAN_RAW`, `CAN_BCM` 또는 `CAN_ISOTP` 중 하나여야 합니다.

  fileno를 지정하면, family, type 및 proto 값이 지정된 파일 기술자에서 자동 감지됩니다. 명시적 family, type 또는 proto 인자를 사용하여 함수를 호출하면 자동 감지가 무효화 될 수 있습니다. 이는 파이썬이 `socket.getpeername()`의 반환 값을 나타내는 방식에 영향을 미치지만, 실제 OS 자원에는 영향을 주지 않습니다. `socket.fromfd()`와는 달리, fileno는 복제본이 아니라 같은 소켓을 반환합니다. 이렇게 하면 `socket.close()`를 사용하여 분리된 소켓을 닫을 수 있습니다.

  새로 만들어진 소켓은 상속 불가능합니다.

  버전 3.3에서 변경: AF_CAN 패밀리가 추가되었습니다. AF_RDS 패밀리가 추가되었습니다.

  버전 3.4에서 변경: CAN_BCM 프로토콜이 추가되었습니다.

  버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.

  버전 3.7에서 변경: CAN_ISOTP 프로토콜이 추가되었습니다.

  버전 3.7에서 변경: When `SOCK_NONBLOCK` or `SOCK_CLOEXEC` bit flags are applied to type they are cleared, and `socket.type` will not reflect them. They are still passed to the underlying system socket() call. Therefore,

      sock = socket.socket(
          socket.AF_INET,
          socket.SOCK_STREAM | socket.SOCK_NONBLOCK)

  는 여전히 `SOCK_NONBLOCK`를 지원하는 OS에서 비 블로킹 소켓을 만들지만, `sock.type`은 `socket.SOCK_STREAM`로 설정됩니다.

`socket.``socketpair`([family[, type[, proto]]])

  제공된 주소 패밀리, 소켓 유형 및 프로토콜 번호를 사용하여 연결된 소켓 객체 쌍을 만듭니다. 주소 패밀리, 소켓 유형 및 프로토콜 번호는 위의 `socket()` 함수와 같습니다. 플랫폼에서 정의되어 있으면 기본 패밀리는 `AF_UNIX`입니다; 그렇지 않으면 기본값은 `AF_INET`입니다.

  새로 만들어진 소켓은 상속 불가능합니다.

  버전 3.2에서 변경: 반환된 소켓 객체는 이제 부분 집합이 아닌 전체 소켓 API를 지원합니다.

  버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.

  버전 3.5에서 변경: 윈도우 지원이 추가되었습니다.

`socket.``create_connection`(address[, timeout[, source_address]])

  인터넷 address(2-튜플 `(host, port)`)에서 리스닝하는 TCP 서비스에 연결하고 소켓 객체를 반환합니다. 이것은 `socket.connect()` 보다 고수준 함수입니다: host가 숫자가 아닌 호스트 명이면, `AF_INET`과 `AF_INET6` 모두로 결정하려고 시도한 다음, 연결이 성공할 때까지 차례대로 모든 가능한 주소로 연결을 시도합니다. 이것은 IPv4 및 IPv6 모두에 호환되는 클라이언트를 쉽게 작성할 수 있도록 합니다.

  선택적 timeout 매개 변수를 전달하면 연결을 시도하기 전에 소켓 인스턴스의 시간제한을 설정합니다. timeout이 제공되지 않으면, `getdefaulttimeout()`에 의해 반환된 전역 기본 시간제한 설정이 사용됩니다.

  제공되면, source_address는 연결하기 전에 소켓이 소스 주소로 바인드 할 2-튜플 `(host, port)` 여야 합니다. 호스트나 포트가 각각 ‘’ 나 0이면 OS 기본 동작이 사용됩니다.

  버전 3.2에서 변경: source_address가 추가되었습니다.

`socket.``fromfd`(fd, family, type, proto=0)

  파일 기술자 fd(파일 객체의 `fileno()` 메서드에서 반환된 정수)를 복제하고 결과로 소켓 객체를 만듭니다. 주소 패밀리, 소켓 유형 및 프로토콜 번호는 위의 `socket()` 함수와 같습니다. 파일 기술자는 소켓을 참조해야 하지만, 검사하지는 않습니다 — 파일 기술자가 유효하지 않으면 객체에 대한 후속 연산이 실패할 수 있습니다. 이 함수는 거의 필요하지 않지만, 프로그램에 표준 입력이나 출력으로 프로그램에 전달된 (가령 유닉스 inet 데몬으로 시작한 서버) 소켓의 소켓 옵션을 가져오거나 설정하는 데 사용할 수 있습니다. 소켓은 블로킹 모드로 간주합니다.

  새로 만들어진 소켓은 상속 불가능합니다.

  버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.

`socket.``fromshare`(data)

  `socket.share()` 메서드에서 얻은 데이터로 소켓의 인스턴스를 만듭니다. 소켓은 블로킹 모드로 간주합니다.

  가용성: 윈도우.

  버전 3.3에 추가.

`socket.``SocketType`

  이것은 소켓 객체 형을 나타내는 파이썬 형 객체입니다. `type(socket(...))`과 같습니다.

#### 기타 함수

`socket` 모듈은 또한 다양한 네트워크 관련 서비스를 제공합니다:

`socket.``close`(fd)

  소켓 파일 기술자를 닫습니다. 이것은 `os.close()`와 비슷하지만, 소켓 용입니다. 일부 플랫폼(가장 눈에 띄는 것은 윈도우)에서는 `os.close()`가 소켓 파일 기술자에 대해 작동하지 않습니다.

  버전 3.7에 추가.

`socket.``getaddrinfo`(host, port, family=0, type=0, proto=0, flags=0)

  host/port 인자를 해당 서비스에 연결된 소켓을 만드는 데 필요한 모든 인자가 들어있는 5-튜플의 시퀀스로 변환합니다. host는 도메인 이름, IPv4/v6 주소의 문자열 표현 또는 `None``입니다. *port*\는 ``'http'`와 같은 문자열 서비스 이름, 숫자 포트 번호 또는 `None``입니다. ``None`을 host 와 port의 값으로 전달해서, `NULL`을 하부 C API에 전달할 수 있습니다.

  family, type 및 proto 인자는 선택적으로 지정되어 반환된 주소 목록을 축소합니다. 이 인자 각각에 대한 값으로 0을 전달하면 전체 결과 범위가 선택됩니다. flags 인자는 `AI_*` 상수 중 하나 또는 여러 개일 수 있으며, 결과가 계산되고 반환되는 방식에 영향을 줍니다. 예를 들어, `AI_NUMERICHOST`는 도메인 이름 결정을 비활성화하고, host가 도메인 이름이면 에러를 발생시킵니다.

  이 함수는 다음과 같은 구조의 5-튜플의 리스트를 반환합니다:

  `(family, type, proto, canonname, sockaddr)`

  이 튜플에서, family, type, proto는 모두 정수이며 `socket()` 함수로 전달됩니다. canonname은 `AI_CANONNAME`가 flags 인자의 일부일 때 host의 규범적(canonical) 이름을 나타내는 문자열입니다; 그렇지 않으면 canonname가 비어 있습니다. sockaddr은 반환된 family에 따라 형식이 달라지는, 소켓 주소를 설명하는 튜플이며 (`AF_INET`이면 `(address, port)` 2-튜플, `AF_INET6`이면 `(address, port, flow info, scope id)` 4-튜플), `socket.connect()` 메서드로 전달됩니다.

  다음 예제는 `example.org`의 포트 80으로 가는 가상의 TCP 연결에 대한 주소 정보를 가져옵니다 (IPv6가 활성화되지 않았으면 여러분의 시스템에서는 결과가 다를 수 있습니다):

      >>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)
      [(<AddressFamily.AF_INET6: 10>, <SocketType.SOCK_STREAM: 1>,
       6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
       (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>,
       6, '', ('93.184.216.34', 80))]

  버전 3.2에서 변경: 매개 변수는 이제 키워드 인자를 사용하여 전달할 수 있습니다.

  버전 3.7에서 변경: IPv6 멀티캐스트 주소의 경우, 주소를 나타내는 문자열에는 `%scope` 부분이 포함되지 않습니다.

`socket.``getfqdn`([name])

  name의 완전히 정규화된 도메인 이름을 반환합니다. name이 생략되거나 비어 있으면, 지역 호스트로 해석됩니다. 완전히 정규화된 이름을 찾기 위해, `gethostbyaddr()`에 의해 반환된 호스트 이름이 검사되고, 있다면 그 호스트의 별칭이 뒤따릅니다. 마침표가 포함된 첫 번째 이름이 선택됩니다. 완전히 정규화된 도메인 이름이 없으면, `gethostname()`에서 반환된 호스트 이름이 반환됩니다.

`socket.``gethostbyname`(hostname)

  호스트 이름을 IPv4 주소 형식으로 변환합니다. IPv4 주소는 `'100.50.200.5'`와 같은 문자열로 반환됩니다. 호스트 이름이 IPv4 주소면 변경되지 않고 반환됩니다. 더욱 완전한 인터페이스는 `gethostbyname_ex()`를 참조하십시오. `gethostbyname()`는 IPv6 이름 결정을 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신 `getaddrinfo()`를 사용해야 합니다.

`socket.``gethostbyname_ex`(hostname)

  호스트 이름을 IPv4 주소 형식으로 변환합니다, 확장 인터페이스. 트리플 `(hostname, aliaslist, ipaddrlist)`를 반환합니다. 여기서 hostname은 지정된 ip_address에 응답하는 기본 호스트 이름이고, aliaslist는 같은 주소에 대한 대안 호스트 이름의 리스트(비어있을 수 있습니다)이며, ipaddrlist는 같은 호스트의 같은 인터페이스에 대한 IPv4 주소 리스트입니다 (항상 그렇지는 않지만, 종종 단일 주소). `gethostbyname_ex()`는 IPv6 이름 결정을 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신 `getaddrinfo()`를 사용해야 합니다.

`socket.``gethostname`()

  파이썬 인터프리터가 현재 실행 중인 기계의 호스트 명을 포함한 문자열을 반환합니다.

  참고: `gethostname()`은 항상 완전히 정규화된 도메인 이름을 반환하지는 않습니다; 원한다면 `getfqdn()`을 사용하십시오.

`socket.``gethostbyaddr`(ip_address)

  트리플 `(hostname, aliaslist, ipaddrlist)`를 반환합니다. 여기서 hostname는 지정된 ip_address에 응답하는 기본 호스트 이름이고, aliaslist는 같은 주소에 대한 대체 호스트 이름의 (비어있을 수 있는) 리스트이며, ipaddrlist는 같은 호스트의 같은 인터페이스에 대한 IPv4/v6 주소 리스트입니다 (대개 단일 주소만 포함합니다). 완전히 정규화된 도메인 이름을 찾으려면, `getfqdn()` 함수를 사용하십시오. `gethostbyaddr()`는 IPv4와 IPv6를 모두 지원합니다.

`socket.``getnameinfo`(sockaddr, flags)

  소켓 주소 sockaddr를 2-튜플 `(host, port)`로 변환합니다. flags의 설정에 따라, 결과의 host에 완전히 정규화된 도메인 이름이나 숫자 주소 표현이 포함될 수 있습니다. 마찬가지로, port에는 문자열 포트 이름이나 숫자 포트 번호가 포함될 수 있습니다.

  IPv6 주소의 경우, sockaddr에 의미 있는 scopeid가 있으면 `%scope`를 host 부분에 덧붙입니다. 보통 이것은 멀티캐스트 주소에서 일어납니다.

`socket.``getprotobyname`(protocolname)

  인터넷 프로토콜 이름(예를 들어, `'icmp'`)을 `socket()` 함수의 (선택적인) 세 번째 인자로 전달하기에 적합한 상수로 변환합니다. 이것은 일반적으로 “원시” 모드(`SOCK_RAW`)로 열린 소켓에만 필요합니다; 일반 소켓 모드에서는, 프로토콜이 생략되거나 0이면 올바른 프로토콜이 자동으로 선택됩니다.

`socket.``getservbyname`(servicename[, protocolname])

  인터넷 서비스 이름과 프로토콜 이름을 해당 서비스의 포트 번호로 변환합니다. 선택적 프로토콜 이름은, 주어진다면, `'tcp'` 나 `'udp'` 여야 합니다, 그렇지 않으면 모든 프로토콜과 일치합니다.

`socket.``getservbyport`(port[, protocolname])

  인터넷 포트 번호와 프로토콜 이름을 해당 서비스의 서비스 이름으로 변환합니다. 선택적 프로토콜 이름은, 주어진다면, `'tcp'` 나 `'udp'` 여야 합니다, 그렇지 않으면 모든 프로토콜과 일치합니다.

`socket.``ntohl`(x)

  32비트 양의 정수를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 4바이트 스와프 연산을 수행합니다.

`socket.``ntohs`(x)

  16비트 양의 정수를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 2바이트 스와프 연산을 수행합니다.

  버전 3.7부터 폐지: x가 16비트 부호 없는 정수에 맞지 않지만, 양의 C int에 맞으면, 16비트 부호 없는 정수로 자동 절단됩니다. 이 자동 절단 기능은 폐지되었으며, 미래 버전의 파이썬에서는 예외가 발생할 것입니다.

`socket.``htonl`(x)

  32비트 양의 정수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 4바이트 스와프 연산을 수행합니다.

`socket.``htons`(x)

  16비트 양의 정수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 2바이트 스와프 연산을 수행합니다.

  버전 3.7부터 폐지: x가 16비트 부호 없는 정수에 맞지 않지만, 양의 C int에 맞으면, 16비트 부호 없는 정수로 자동 절단됩니다. 이 자동 절단 기능은 폐지되었으며, 미래 버전의 파이썬에서는 예외가 발생할 것입니다.

`socket.``inet_aton`(ip_string)

  IPv4 주소를 점 분리 쿼드 문자열 형식(예를 들어, ‘123.45.67.89’)에서 길이가 4자인 바이트열 객체로 32비트 압축 바이너리 형식으로 변환합니다. 이 함수는 표준 C 라이브러리를 사용하고 `struct in_addr` 형(이 함수가 반환하는 32비트 압축 바이너리의 C형입니다)의 객체를 요구하는 프로그램과 대화할 때 유용합니다.

  `inet_aton()`는 3점 미만의 문자열도 허용합니다; 자세한 내용은 유닉스 매뉴얼 페이지 inet(3)을 참조하십시오.

  이 함수에 전달된 IPv4 주소 문자열이 유효하지 않으면, `OSError`가 발생합니다. 정확히 무엇이 유효한지는 `inet_aton()`의 하부 C 구현에 따라 달라짐에 유의하십시오.

  `inet_aton()`은 IPv6를 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신 `inet_pton()`를 사용해야 합니다.

`socket.``inet_ntoa`(packed_ip)

  32비트 압축 IPv4 주소(길이가 4바이트인 바이트열 객체)를 표준 점선 분리 쿼드 문자열 표현(예를 들어, ‘123.45.67.89’)으로 변환합니다. 이 함수는 표준 C 라이브러리를 사용하고 `struct in_addr` 형(이 함수가 인자로 받아들이는 32비트 압축 바이너리 데이터의 C형입니다)의 객체를 요구하는 프로그램과 대화할 때 유용합니다.

  이 함수에 전달된 바이트 시퀀스가 정확히 4바이트 길이가 아니면, `OSError`가 발생합니다. `inet_ntoa()`는 IPv6를 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신 `inet_ntop()`를 사용해야 합니다.

  버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.

`socket.``inet_pton`(address_family, ip_string)

  패밀리 특정 문자열 형식의 IP 주소를 압축 바이너리 형식으로 변환합니다. `inet_pton()`는 라이브러리나 네트워크 프로토콜이 `struct in_addr` 형(`inet_aton()`과 유사)이나 `struct in6_addr` 형의 객체로 호출할 때 유용합니다.

  address_family에 대해 지원되는 값은 현재 `AF_INET`과 `AF_INET6`입니다. IP 주소 문자열 ip_string가 유효하지 않으면, `OSError`가 발생합니다. 정확히 무엇이 유효한지는 address_family의 값과 `inet_pton()`의 하부 구현에 따라 달라집니다.

  가용성: 유닉스(모든 플랫폼이 아닐 수도 있음), 윈도우.

  버전 3.4에서 변경: 윈도우 지원이 추가되었습니다

`socket.``inet_ntop`(address_family, packed_ip)

  압축 IP 주소(일정 길이의 바이트열 객체)를 그것의 표준 패밀리 특정 문자열 표현(예를 들어, `'7.10.0.5'` 나 `'5aef:2b::8'`)으로 변환합니다. `inet_ntop()`는 라이브러리나 네트워크 프로토콜이 `struct in_addr` 형(`inet_ntoa()`와 유사)이나 `struct in6_addr` 형의 객체를 반환할 때 유용합니다.

  address_family에 대해 지원되는 값은 현재 `AF_INET`과 `AF_INET6`입니다. 바이트열 객체 packed_ip가 지정된 주소 패밀리의 올바른 길이가 아니면, `ValueError`가 발생합니다. `inet_ntop()` 호출로 인한 에러에는 `OSError`가 발생합니다.

  가용성: 유닉스(모든 플랫폼이 아닐 수도 있음), 윈도우.

  버전 3.4에서 변경: 윈도우 지원이 추가되었습니다

  버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.

`socket.``CMSG_LEN`(length)

  주어진 length의 연관된 데이터가 있는 보조(ancillary) 데이터 항목의 (후행 패딩을 제외한) 총 길이를 반환합니다. 이 값은 `recvmsg()`가 보조 데이터의 단일 항목을 수신하기 위한 버퍼 크기로 종종 사용될 수 있지만, RFC 3542는 이식성 있는 응용 프로그램에서 `CMSG_SPACE()`를 사용하도록 요구하는데, 항목이 버퍼의 마지막 부분일 때도 패딩을 위한 공간을 포함합니다. length가 허용되는 값 범위를 벗어나면 `OverflowError`를 발생시킵니다.

  가용성: 대부분 유닉스 플랫폼, 다른 것들도 가능합니다.

  버전 3.3에 추가.

`socket.``CMSG_SPACE`(length)

  주어진 length의 연관된 데이터가 있는 보조(ancillary) 데이터 항목을 수신하기 위해 `recvmsg()`에 필요한 버퍼 크기를 반환하는데, 후행 패딩을 포함합니다. 여러 항목을 수신하는 데 필요한 버퍼 공간은 연관된 데이터 길이에 대한 `CMSG_SPACE()` 값의 합입니다. length가 허용되는 값 범위를 벗어나면 `OverflowError`를 발생시킵니다.

  일부 시스템에서는 이 함수를 제공하지 않으면서 보조(ancillary) 데이터를 지원할 수 있음에 유의하십시오. 또한, 이 함수의 결과를 사용하여 버퍼 크기를 설정하면 수신할 수 있는 보조 데이터의 양이 정확하게 제한되지 않을 수 있음에도 유의하십시오. 추가 데이터가 패딩 영역에 들어갈 수 있기 때문입니다.

  가용성: 대부분 유닉스 플랫폼, 다른 것들도 가능합니다.

  버전 3.3에 추가.

`socket.``getdefaulttimeout`()

  새로운 소켓 객체의 기본 시간제한을 초 단위로 (float) 반환합니다. `None` 값은 새 소켓 객체가 시간제한이 없음을 나타냅니다. 소켓 모듈을 처음 임포트 할 때 기본값은 `None`입니다.

`socket.``setdefaulttimeout`(timeout)

  새 소켓 객체의 기본 시간제한을 초 단위로 (float) 설정합니다. 소켓 모듈을 처음 임포트 할 때 기본값은 `None`입니다. 가능한 값과 해당 의미는 `settimeout()`을 참조하십시오.

`socket.``sethostname`(name)

  기계의 호스트 명을 name으로 설정합니다. 충분한 권한이 없으면 `OSError`가 발생합니다.

  가용성: 유닉스.

  버전 3.3에 추가.

`socket.``if_nameindex`()

  네트워크 인터페이스 정보 (인덱스 정수, 이름 문자열) 튜플의 리스트를 반환합니다. 시스템 호출이 실패하면 `OSError`.

  가용성: 유닉스.

  버전 3.3에 추가.

`socket.``if_nametoindex`(if_name)

  인터페이스 이름에 대응하는 네트워크 인터페이스 인덱스 번호를 반환합니다. 주어진 이름을 가진 인터페이스가 없으면 `OSError`.

  가용성: 유닉스.

  버전 3.3에 추가.

`socket.``if_indextoname`(if_index)

  인터페이스 인덱스 번호에 해당하는 네트워크 인터페이스 이름을 반환합니다. 지정된 인덱스의 인터페이스가 없으면 `OSError`.

  가용성: 유닉스.

  버전 3.3에 추가.

## 소켓 객체

소켓 객체에는 다음과 같은 메서드가 있습니다. `makefile()`를 제외하고, 이것들은 소켓에 적용할 수 있는 유닉스 시스템 호출에 해당합니다.

버전 3.2에서 변경: 컨텍스트 관리자 프로토콜 지원이 추가되었습니다. 컨텍스트 관리자를 빠져나가는 것은 `close()`를 호출하는 것과 동등합니다.

`socket.``accept`()

  연결을 받아들입니다. 소켓은 주소에 바인드되어 연결을 리스닝하고 있어야 합니다. 반환 값은 `(conn, address)` 쌍입니다. 여기서 conn는 연결에서 데이터를 보내고 받을 수 있는 새로운 소켓 객체이고, address는 연결의 다른 끝에 있는 소켓에 바인드 된 주소입니다.

  새로 만들어진 소켓은 상속 불가능합니다.

  버전 3.4에서 변경: 소켓은 이제 상속 불가능합니다.

  버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).

`socket.``bind`(address)

  소켓을 address에 바인드 합니다. 소켓은 이미 바인드 되어 있으면 안 됩니다. (address의 형식은 주소 패밀리에 따라 다릅니다 — 위를 보십시오.)

`socket.``close`()

  소켓을 닫힌 상태로 표시합니다. 하부 시스템 자원(예를 들어, 파일 기술자)도 `makefile()`로 만든 모든 파일 객체가 닫힐 때 닫힙니다. 일단 닫히면, 소켓 객체에 대한 이후의 모든 연산이 실패합니다. 원격 끝은 더는 데이터를 수신하지 않게 됩니다 (계류 중인 데이터가 플러시 된 후에).

  소켓은 가비지 수집될 때 자동으로 닫히지만, 명시적으로 `close()`하거나 `with` 문을 사용하는 것이 좋습니다.

  버전 3.6에서 변경: 하부 `close()` 호출이 수행될 때 에러가 발생하면 이제 `OSError`가 발생합니다.

  참고

  `close()`는 연결과 관련된 자원을 해제하지만, 반드시 연결을 즉시 닫을 필요는 없습니다. 적시에 연결을 닫으려면, `close()` 전에 `shutdown()`을 호출하십시오.

`socket.``connect`(address)

  address에 있는 원격 소켓에 연결합니다. (address의 형식은 주소 패밀리에 따라 다릅니다 — 위를 보십시오.)

  시그널로 연결이 인터럽트 되면, 메서드는 연결이 완료될 때까지 대기하거나, 시그널 처리기가 예외를 발생시키지 않고 소켓이 블로킹하거나 시간제한이 있으면 `socket.timeout`을 발생시킵니다. 비 블로킹 소켓의 경우, 이 메서드는 시그널로 연결이 인터럽트 되면 `InterruptedError` 예외(또는 시그널 처리기에서 발생한 예외)를 발생시킵니다.

  버전 3.5에서 변경: 연결이 시그널에 의해 인터럽트 되고, 시그널 처리기가 예외를 발생시키지 않고, 소켓이 블로킹하거나 시간제한을 가지면, 이 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 연결이 완료될 때까지 대기합니다 (이유는 PEP 475를 참조하십시오).

`socket.``connect_ex`(address)

  `connect(address)`와 비슷하지만, C 수준의 `connect()` 호출로 반환된 에러에 대한 예외를 발생시키는 대신 에러 표시기를 반환합니다 (“호스트를 찾을 수 없음”과 같은 다른 문제는 여전히 예외를 발생시킬 수 있습니다). 연산이 성공하면 에러 표시기는 `0`이고, 그렇지 않으면 `errno` 변수의 값입니다. 예를 들어 비동기 연결을 지원하는 데 유용합니다.

`socket.``detach`()

  하부 파일 기술자를 실제로 닫지 않으면서 소켓 객체를 닫힌 상태로 만듭니다. 파일 기술자가 반환되고, 다른 용도로 재사용 될 수 있습니다.

  버전 3.2에 추가.

`socket.``dup`()

  소켓을 복제합니다.

  새로 만들어진 소켓은 상속 불가능합니다.

  버전 3.4에서 변경: 소켓은 이제 상속 불가능합니다.

`socket.``fileno`()

  소켓의 파일 기술자(작은 정수)를 반환하거나, 실패하면 -1을 반환합니다. 이것은 `select.select()`에서 유용합니다.

  윈도우에서, 이 메서드가 돌려주는 작은 정수는 파일 기술자를 사용할 수 있는 곳(가령 `os.fdopen()`)에 사용할 수 없습니다. 유닉스에는 이러한 제한이 없습니다.

`socket.``get_inheritable`()

  소켓의 파일 기술자나 소켓 핸들의 상속 가능 플래그를 가져옵니다: 소켓이 자식 프로세스에서 상속될 수 있으면 `True`, 그렇지 않으면 `False`.

  버전 3.4에 추가.

`socket.``getpeername`()

  소켓이 연결된 원격 주소를 반환합니다. 이것은 예를 들어, 원격 IPv4/v6 소켓의 포트 번호를 찾는 데 유용합니다. (반환되는 주소의 형식은 주소 패밀리에 따라 다릅니다 — 위를 보십시오.) 일부 시스템에서는 이 함수가 지원되지 않습니다.

`socket.``getsockname`()

  소켓 자신의 주소를 반환합니다. 이것은 예를 들어 IPv4/v6 소켓의 포트 번호를 찾는 데 유용합니다. (반환되는 주소의 형식은 주소 패밀리에 따라 다릅니다 — 위를 보십시오.)

`socket.``getsockopt`(level, optname[, buflen])

  주어진 소켓 옵션의 값을 반환합니다 (유닉스 매뉴얼 페이지 getsockopt(2)를 보십시오). 필요한 기호 상수(`SO_*` 등)는 이 모듈에서 정의됩니다. buflen이 없으면, 정수 옵션을 가정하고 해당 정숫값이 함수에서 반환됩니다. buflen이 있으면, 옵션을 수신하는 데 사용되는 버퍼의 최대 길이를 지정하고, 이 버퍼가 바이트열 객체로 반환됩니다. 버퍼의 내용을 디코딩하는 것은 호출자의 책임입니다 (바이트열로 인코딩된 C 구조체를 디코딩하는 방법은 선택적 내장 모듈 `struct`를 참조하십시오).

`socket.``getblocking`()

  소켓이 블로킹 모드면 `True`를 반환하고, 비 블로킹이면 `False`를 반환합니다.

  이것은 `socket.gettimeout() == 0`를 검사하는 것과 동등합니다.

  버전 3.7에 추가.

`socket.``gettimeout`()

  소켓 연산에 관련한 시간제한을 초(float)로 돌려줍니다. 시간제한이 설정되어 있지 않으면 `None`를 돌려줍니다. 이것은 `setblocking()` 이나 `settimeout()`에 대한 마지막 호출을 반영합니다.

`socket.``ioctl`(control, option)
  플랫폼

    윈도우

  `ioctl()` 메서드는 WSAIoctl 시스템 인터페이스에 대한 제한된 인터페이스입니다. 자세한 내용은 Win32 설명서를 참조하십시오.

  다른 플랫폼에서는, 범용 `fcntl.fcntl()` 과 `fcntl.ioctl()` 함수를 사용할 수 있습니다; 첫 번째 인자로 소켓 객체를 받아들입니다.

  현재 다음 제어 코드만 지원됩니다: `SIO_RCVALL`, `SIO_KEEPALIVE_VALS` 및 `SIO_LOOPBACK_FAST_PATH`.

  버전 3.6에서 변경: `SIO_LOOPBACK_FAST_PATH`가 추가되었습니다.

`socket.``listen`([backlog])

  서버가 연결을 수락하도록 합니다. backlog가 지정되면, 0 이상이어야 합니다 (더 낮으면 0으로 설정됩니다); 새로운 연결을 거부하기 전에 시스템이 허락할 수락되지 않은 연결 수를 지정합니다. 지정하지 않으면, 기본값으로 적당한 값이 선택됩니다.

  버전 3.5에서 변경: 이제 backlog 매개 변수가 선택적입니다.

`socket.``makefile`(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)

  소켓과 결합한 파일 객체를 돌려줍니다. 정확한 반환형은 `makefile()`에 주어진 인자에 따라 다릅니다. 이 인자는 내장 `open()` 함수와 같은 방식으로 해석됩니다. 단, 지원되는 mode 값은 `'r'` (기본값), `'w'` 및 `'b'` 뿐입니다.

  소켓은 블로킹 모드 여야 합니다; 시간제한을 가질 수 있지만, 시간 초과가 발생하면 파일 객체의 내부 버퍼가 일관성없는 상태로 끝날 수 있습니다.

  `makefile()`에 의해 반환된 파일 객체를 닫는 것은, 다른 모든 파일 객체가 닫혔고 소켓 객체에서 `socket.close()`가 호출되었지 않은 한 원래 소켓을 닫지는 않습니다.

  참고

  윈도우에서, `makefile()`로 만든 파일류 객체는 파일 기술자가 있는 파일 객체가 필요한 곳에서는 사용할 수 없습니다, 가령 `subprocess.Popen()`의 stream 인자.

`socket.``recv`(bufsize[, flags])

  소켓에서 데이터를 수신합니다. 반환 값은 수신된 데이터를 나타내는 바이트열 객체입니다. 한 번에 수신할 수 있는 최대 데이터양은 bufsize에 의해 지정됩니다. 선택적 인자 flags의 의미는 유닉스 매뉴얼 페이지 recv(2)를 보십시오; 기본값은 0입니다.

  참고

  하드웨어와 네트워크 현실과 가장 잘 일치하려면, bufsize의 값은 2의 비교적 작은 거듭제곱이어야 합니다, 예를 들어 4096.

  버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).

`socket.``recvfrom`(bufsize[, flags])

  소켓에서 데이터를 수신합니다. 반환 값은 `(bytes, address)` 쌍입니다. 여기서 bytes는 수신한 데이터를 나타내는 바이트열 객체이고, address는 데이터를 보내는 소켓의 주소입니다. 선택적 인자 flags의 의미는 유닉스 매뉴얼 페이지 recv(2)를 보십시오; 기본값은 0입니다. (address의 형식은 주소 패밀리에 따라 다릅니다 — 위를 보십시오.)

  버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).

  버전 3.7에서 변경: 멀티캐스트 IPv6 주소의 경우, address의 첫 번째 항목에는 `%scope` 부분이 더는 포함되지 않습니다. 전체 IPv6 주소를 얻으려면 `getnameinfo()`를 사용하십시오.

`socket.``recvmsg`(bufsize[, ancbufsize[, flags]])

  일반 데이터(최대 bufsize 바이트)와 보조(ancillary) 데이터를 소켓에서 수신합니다. ancbufsize 인자는 보조 데이터 수신에 사용되는 내부 버퍼의 크기를 바이트 단위로 설정합니다; 기본값은 0이며 보조 데이터가 수신되지 않는다는 뜻입니다. 보조 데이터를 위한 적절한 버퍼 크기는 `CMSG_SPACE()` 나 `CMSG_LEN()`를 사용하여 계산할 수 있으며, 버퍼에 들어가지 않는 항목은 잘리거나 삭제될 수 있습니다. flags 인자의 기본값은 0이고 `recv()`와 같은 의미입니다.

  반환 값은 4-튜플입니다: `(data, ancdata, msg_flags, address)`. data 항목은 일반 데이터를 담은 `bytes` 객체입니다. ancdata 항목은 수신된 보조 데이터(제어 메시지)를 나타내는 0개 이상의 튜플 `(cmsg_level, cmsg_type, cmsg_data)`의 리스트입니다: cmsg_level 와 cmsg_type는 각각 프로토콜 수준과 프로토콜 특정 형을 지정하는 정수이고, cmsg_data는 연결된 데이터를 담은 `bytes` 객체입니다. msg_flags 항목은 수신된 메시지의 조건을 나타내는 다양한 플래그의 비트별 OR입니다; 자세한 내용은 시스템 설명서를 참조하십시오. 수신 소켓이 연결되어있지 않으면, address는 송신 소켓의 주소입니다, (사용 가능하다면); 그렇지 않으면 값은 지정되지 않습니다.

  일부 시스템에서는, `sendmsg()`와 `recvmsg()`를 사용하여 `AF_UNIX` 소켓을 통해 프로세스 간에 파일 기술자를 전달할 수 있습니다. 이 기능을 사용하면 (`SOCK_STREAM` 소켓으로 제한되는 경우가 많습니다), `recvmsg()`는 보조 데이터에서 `(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)` 형식의 항목을 반환합니다. 여기서 fds는 새 파일 기술자를 네이티브 C `int` 형의 바이너리 배열로 나타내는 `bytes` 객체입니다. `recvmsg()`가 시스템 호출이 반환된 후에 예외를 발생시키면, 먼저 이 메커니즘을 통해 수신된 모든 파일 기술자를 닫으려고 시도합니다.

  일부 시스템은 부분적으로만 수신된 보조 데이터 항목의 절단 길이를 나타내지 않습니다. 항목이 버퍼의 끝을 넘어 확장된 것처럼 보이면, `recvmsg()`는 `RuntimeWarning`를 발생시키고, 관련 데이터의 시작 전에 절단되지 않은 버퍼 내에 있는 부분을 반환합니다.

  `SCM_RIGHTS` 메커니즘을 지원하는 시스템에서, 다음 함수는 최대 maxfds 파일 기술자를 수신하여, 메시지 데이터와 기술자를 담은 리스트를 반환합니다 (관련 없는 수신되는 제어 메시지와 같은 예기치 않은 조건은 무시하면서). `sendmsg()`를 참조하십시오.

      import socket, array

      def recv_fds(sock, msglen, maxfds):
          fds = array.array("i")   # Array of ints
          msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
          for cmsg_level, cmsg_type, cmsg_data in ancdata:
              if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
                  # Append data, ignoring any truncated integers at the end.
                  fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
          return msg, list(fds)

  가용성: 대부분 유닉스 플랫폼, 다른 것들도 가능합니다.

  버전 3.3에 추가.

  버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).

`socket.``recvmsg_into`(buffers[, ancbufsize[, flags]])

  `recvmsg()`처럼 동작해서, 일반 데이터와 보조 데이터를 소켓에서 수신하지만, 새로운 바이트열 객체를 반환하는 대신 일반 데이터를 일련의 버퍼로 분산시킵니다. buffers 인자는 쓰기 가능한 버퍼(예를 들어, `bytearray` 객체)를 내보내는 객체의 이터러블이어야 합니다; 이것들은 모두 기록되었거나 버퍼가 더는 없을 때까지 일반 데이터의 연속적인 덩어리로 채워질 것입니다. 운영 체제는 사용할 수 있는 버퍼 수에 제한(`sysconf()` 값 `SC_IOV_MAX`)을 설정할 수 있습니다. ancbufsize 와 flags 인자는 `recvmsg()`와 같은 의미가 있습니다.

  반환 값은 4-튜플입니다: `(nbytes, ancdata, msg_flags, address)`. 여기서 nbytes는 버퍼에 기록된 일반 데이터의 총 바이트 수이며, ancdata, msg_flags 및 address는 `recvmsg()`와 같습니다.

  예제:

      >>> import socket
      >>> s1, s2 = socket.socketpair()
      >>> b1 = bytearray(b'----')
      >>> b2 = bytearray(b'0123456789')
      >>> b3 = bytearray(b'--------------')
      >>> s1.send(b'Mary had a little lamb')
      22
      >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
      (22, [], 0, None)
      >>> [b1, b2, b3]
      [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]

  가용성: 대부분 유닉스 플랫폼, 다른 것들도 가능합니다.

  버전 3.3에 추가.

`socket.``recvfrom_into`(buffer[, nbytes[, flags]])

  소켓에서 데이터를 수신하는데, 새로운 바이트열을 만드는 대신 buffer에 씁니다. 반환 값은 쌍 `(nbytes, address)`입니다. 여기서 nbytes는 수신 된 바이트 수이고, address는 데이터를 보내는 소켓의 주소입니다. 선택적 인자 flags의 의미에 대해서는 유닉스 매뉴얼 페이지 recv(2)를 보십시오; 기본값은 0입니다. (address의 형식은 주소 패밀리에 따라 다릅니다 — 위를 보십시오.)

`socket.``recv_into`(buffer[, nbytes[, flags]])

  소켓에서 최대 nbytes 바이트까지 수신하는데, 새 바이트열을 만드는 대신 데이터를 버퍼에 저장합니다. nbytes가 지정되지 않으면 (또는 0), 지정된 버퍼에서 사용 가능한 크기까지 수신합니다. 수신 한 바이트 수를 반환합니다. 선택적 인자 flags의 의미에 대해서는 유닉스 매뉴얼 페이지 recv(2)를 보십시오; 기본값은 0입니다.

`socket.``send`(bytes[, flags])

  소켓에 데이터를 보냅니다. 소켓은 원격 소켓에 연결되어야 합니다. 선택적 flags 인자는 위의 `recv()`와 같은 의미입니다. 전송된 바이트 수를 반환합니다. 응용 프로그램은 모든 데이터가 전송되었는지 확인해야 합니다; 일부 데이터만 전송되었으면, 응용 프로그램은 나머지 데이터의 전달을 시도해야 합니다. 이 주제에 대한 자세한 정보는, 소켓 프로그래밍 HOWTO를 참조하십시오.

  버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).

`socket.``sendall`(bytes[, flags])

  소켓에 데이터를 보냅니다. 소켓은 원격 소켓에 연결되어야 합니다. 선택적 flags 인자는 위의 `recv()`와 같은 의미입니다. `send()`와 달리, 이 메서드는 모든 데이터가 전송되거나 에러가 발생할 때까지 bytes의 데이터를 계속 전송합니다. 성공하면 `None`이 반환됩니다. 에러가 발생하면, 예외가 발생하는데, 성공적으로 전송된 데이터양을 (있기는 하다면) 확인하는 방법은 없습니다.

  버전 3.5에서 변경: 소켓 시간제한은 데이터가 성공적으로 전송될 때마다 더는 재설정되지 않습니다. 소켓 시간제한은 이제 모든 데이터를 전송할 수 있는 최대 총 지속 시간입니다.

  버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).

`socket.``sendto`(bytes, address)
`socket.``sendto`(bytes, flags, address)

  소켓에 데이터를 보냅니다. 대상 소켓이 address로 지정되므로, 소켓은 원격 소켓에 연결되지 않아야 합니다. 선택적 flags 인자는 위의 `recv()`와 같은 의미가 있습니다. 전송된 바이트 수를 반환합니다. (address의 형식은 주소 패밀리에 따라 다릅니다 — 위를 보십시오.)

  버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).

`socket.``sendmsg`(buffers[, ancdata[, flags[, address]]])

  소켓에 일반과 보조 데이터를 보는데, 일련의 버퍼에서 일반 데이터를 모아서 단일 메시지로 연결합니다. buffers 인자는 일반 데이터를 바이트열류 객체의 이터러블로 지정합니다 (예를 들어, `bytes` 객체); 운영 체제는 사용할 수 있는 버퍼 수에 제한(`sysconf()` 값 `SC_IOV_MAX`)을 설정할 수 있습니다. ancdata 인자는 보조 데이터 (제어 메시지)를 0개 이상의 튜플 `(cmsg_level, cmsg_type, cmsg_data)`의 이터러블로 지정합니다. 여기서 cmsg_level 와 cmsg_type는 각각 프로토콜 수준과 프로토콜 특정 형을 지정하는 정수이고, cmsg_data는 연결된 데이터를 담은 바이트열류 객체입니다. 일부 시스템(특히, `CMSG_SPACE()`가 없는 시스템)은 호출 당 하나의 제어 메시지를 송신하는 것만 지원할 수 있습니다. flags 인자의 기본값은 0이고 `send()`와 같은 의미입니다. address가 제공되고 `None`이 아니면, 메시지의 대상 주소를 설정합니다. 반환 값은 전송된 일반 데이터의 바이트 수입니다.

  다음 함수는 `SCM_RIGHTS` 메커니즘을 지원하는 시스템에서, `AF_UNIX` 소켓을 통해 파일 기술자 리스트 fds를 보냅니다. `recvmsg()`도 참조하세요.

      import socket, array

      def send_fds(sock, msg, fds):
          return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])

  가용성: 대부분 유닉스 플랫폼, 다른 것들도 가능합니다.

  버전 3.3에 추가.

  버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 `InterruptedError` 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).

`socket.``sendmsg_afalg`([msg, ]*, op[, iv[, assoclen[, flags]]])

  `AF_ALG` 소켓용, `sendmsg()`의 특수한 버전. `AF_ALG` 소켓에 대한 모드, IV, AEAD 관련 데이터 길이 및 플래그를 설정합니다.

  가용성 : 리눅스 >= 2.6.38.

  버전 3.6에 추가.

`socket.``sendfile`(file, offset=0, count=None)

  고성능 `os.sendfile`을 사용하여 EOF에 도달할 때까지 파일을 보내고, 보낸 총 바이트 수를 반환합니다. file은 바이너리 모드로 열린 일반 파일 객체여야 합니다. `os.sendfile`을 사용할 수 없거나 (예를 들어, 윈도우) file가 일반 파일이 아니면, `send()`가 대신 사용됩니다. offset은 파일 읽기 시작할 위치를 알려줍니다. 지정되면, count는 EOF에 도달할 때까지 파일을 전송하는 대신 전송할 총 바이트 수입니다. 파일 위치는 반환하거나 에러가 발생했을 때 갱신됩니다. 이때 `file.tell()`을 사용하여 전송된 바이트 수를 계산할 수 있습니다. 소켓은 `SOCK_STREAM` 유형이어야 합니다. 비 블로킹 소켓은 지원되지 않습니다.

  버전 3.5에 추가.

`socket.``set_inheritable`(inheritable)

  소켓의 파일 기술자나 소켓 핸들의 상속 가능 플래그를 설정합니다.

  버전 3.4에 추가.

`socket.``setblocking`(flag)

  소켓의 블로킹이나 비 블로킹 모드를 설정합니다. flag가 거짓이면, 소켓은 비 블로킹으로 설정되고, 그렇지 않으면 블로킹 모드로 설정됩니다.

  이 메서드는 특정 `settimeout()` 호출의 줄인 표현입니다:

  - `sock.setblocking(True)`는 `sock.settimeout(None)`와 동등합니다

  - `sock.setblocking(False)`는 `sock.settimeout(0.0)`와 동등합니다

  버전 3.7에서 변경: 이 메서드는 더는 `socket.type`에 `SOCK_NONBLOCK` 플래그를 적용하지 않습니다.

`socket.``settimeout`(value)

  블로킹 소켓 연산에 시간제한을 설정합니다. value 인자는 초로 표현된 음수가 아닌 부동 소수점 수나 `None` 일 수 있습니다. 0이 아닌 값을 주면, 후속 소켓 연산에서, 연산이 완료되기 전에 시간제한 기간 value가 지나면 `timeout` 예외를 발생시킵니다. 0을 지정하면, 소켓은 비 블로킹 모드가 됩니다. `None`이 주어지면, 소켓은 블로킹 모드가 됩니다.

  자세한 내용은, 소켓 시간제한에 대한 참고 사항을 보십시오.

  버전 3.7에서 변경: 이 메서드는 더는 `socket.type`의 `SOCK_NONBLOCK` 플래그를 토글하지 않습니다.

`socket.``setsockopt`(level, optname, value: int)

`socket.``setsockopt`(level, optname, value: buffer)

`socket.``setsockopt`(level, optname, None, optlen: int)

  Set the value of the given socket option (see the Unix manual page setsockopt(2)). The needed symbolic constants are defined in the `socket` module (`SO_*` etc.). The value can be an integer, `None` or a bytes-like object representing a buffer. In the later case it is up to the caller to ensure that the bytestring contains the proper bits (see the optional built-in module `struct` for a way to encode C structures as bytestrings). When value is set to `None`, optlen argument is required. It’s equivalent to call `setsockopt()` C function with `optval=NULL` and `optlen=optlen`.

  버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.

  버전 3.6에서 변경: setsockopt(level, optname, None, optlen: int) 형식이 추가되었습니다.

`socket.``shutdown`(how)

  연결의 한쪽 또는 양쪽 절반을 닫습니다. how가 `SHUT_RD`면, 추가 수신이 허용되지 않습니다. how가 `SHUT_WR`이면, 추가 전송이 허용되지 않습니다. how가 `SHUT_RDWR`이면, 추가 송수신이 허용되지 않습니다.

`socket.``share`(process_id)

  소켓을 복제하고 대상 프로세스와 공유할 수 있도록 준비합니다. 대상 프로세스는 process_id로 제공되어야 합니다. 결과 바이트열 객체는 어떤 프로세스 간 통신의 형태를 사용하여 대상 프로세스로 전달될 수 있으며 그곳에서 `fromshare()`를 사용하여 소켓을 다시 만들 수 있습니다. 일단, 이 메서드가 호출되면, 운영 체제가 이미 대상 프로세스를 위해 이를 복제 했으므로 소켓을 닫아도 안전합니다.

  가용성: 윈도우.

  버전 3.3에 추가.

메서드 `read()` 나 `write()`가 없다는 점에 유의하십시오; 대신 `recv()` 와 `send()`를 flags 인자 없이 사용하십시오.

소켓 객체는 또한 `socket` 생성자에 지정된 값에 대응하는 다음과 같은 (읽기 전용) 어트리뷰트를 가집니다.

`socket.``family`

  소켓 패밀리.

`socket.``type`

  소켓 유형.

`socket.``proto`

  소켓 프로토콜.

## 소켓 시간제한에 대한 참고 사항

소켓 객체는 세 가지 모드 중 하나일 수 있습니다: 블로킹, 비 블로킹, 또는 시간제한. 소켓은 기본적으로 항상 블로킹 모드로 생성되지만, 이는 `setdefaulttimeout()`를 호출하여 변경할 수 있습니다.

- 블로킹 모드에서, 연산은 완료되거나 시스템에서 에러(가령 연결 시간 초과)를 반환할 때까지 블록합니다.

- 비 블로킹 모드에서, 연산은 즉시 완료할 수 없으면 실패합니다 (불행히도 시스템 종속적인 에러로): `select`의 함수를 사용하여 소켓이 읽기나 쓰기가 가능한 시기를 알 수 있습니다.

- 시간제한 모드에서, 연산은 소켓에 대해 지정된 제한 시간 내에 완료할 수 없거나 (`timeout` 예외 발생), 시스템이 에러를 반환하면 실패합니다.

참고

운영 체제 수준에서, 시간제한 모드의 소켓은 내부적으로 비 블로킹 모드로 설정됩니다. 또한, 블로킹과 시간제한 모드는 같은 네트워크 끝점을 가리키는 파일 기술자와 소켓 객체 간에 공유됩니다. 이 구현 세부 사항은 가시적인 결과를 가져올 수 있습니다, 예를 들어, 소켓의 `fileno()`를 사용하기로 한 경우가 그렇습니다.

### 시간제한과 `connect` 메서드

`connect()` 연산도 시간제한 설정의 영향을 받으며, 일반적으로 `connect()`를 호출하기 전에 `settimeout()`를 호출하거나 `create_connection()`에 timeout 매개 변수를 전달하는 것이 좋습니다. 그러나, 시스템 네트워크 스택은 파이썬 소켓 시간제한 설정과 관계없이 자체의 연결 시간제한 에러를 반환할 수 있습니다.

### 시간제한과 `accept` 메서드

`getdefaulttimeout()`가 `None`이 아니면, `accept()` 메서드에서 반환된 소켓은 그 시간제한을 상속합니다. 그렇지 않으면, 동작은 리스닝 소켓의 설정에 따라 다릅니다:

- 리스닝 소켓이 블로킹 모드 나 시간제한 모드에 있으면, `accept()`에 의해 반환된 소켓은 블로킹 모드에 있습니다.

- 리스닝 소켓이 비 블로킹 모드에 있으면, `accept()`에 의해 반환된 소켓이 블로킹 모드인지 비 블로킹 모드인지는 운영 체제에 따라 다릅니다. 플랫폼 간 동작을 보장하려면, 이 설정을 직접 재정의하는 것이 좋습니다.

## 예제

다음은 TCP/IP 프로토콜을 사용하는 4가지 최소 예제 프로그램입니다: (하나의 클라이언트만 서비스하는) 수신한 모든 데이터를 반향하는 서버와, 이를 사용하는 클라이언트. 서버는 `socket()`, `bind()`, `listen()`, `accept()` (두 개 이상의 클라이언트에 서비스를 제공하기 위해 `accept()`를 반복할 수 있습니다) 절차를 수행해야 하지만, 클라이언트는 `socket()`, `connect()` 절차만 요구함에 유의하십시오. 또한, 서버는 수신 대기 중인 소켓이 아니라 `accept()`가 반환한 새 소켓에 대해서 `sendall()`/`recv()`를 한다는 것에도 유의하십시오.

처음 두 예제는 IPv4만 지원합니다.

    # Echo server program
    import socket

    HOST = ''                 # Symbolic name meaning all available interfaces
    PORT = 50007              # Arbitrary non-privileged port
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen(1)
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024)
                if not data: break
                conn.sendall(data)

    # Echo client program
    import socket

    HOST = 'daring.cwi.nl'    # The remote host
    PORT = 50007              # The same port as used by the server
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(b'Hello, world')
        data = s.recv(1024)
    print('Received', repr(data))

다음 두 예제는 위의 두 예제와 같지만, IPv4와 IPv6를 모두 지원합니다. 서버 측은 사용 가능한 첫 번째 주소 패밀리를 리슨합니다 (대신 두 주소를 모두 리슨 해야 합니다). 대부분 IPv6 지원 시스템에서, IPv6가 우선하며 서버가 IPv4 트래픽을 허용하지 않을 수 있습니다. 클라이언트 측은 이름 결정의 결과로 반환된 모든 주소에 연결을 시도하고 성공적으로 연결된 첫 번째 주소로 트래픽을 보냅니다.

    # Echo server program
    import socket
    import sys

    HOST = None               # Symbolic name meaning all available interfaces
    PORT = 50007              # Arbitrary non-privileged port
    s = None
    for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                                  socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
        af, socktype, proto, canonname, sa = res
        try:
            s = socket.socket(af, socktype, proto)
        except OSError as msg:
            s = None
            continue
        try:
            s.bind(sa)
            s.listen(1)
        except OSError as msg:
            s.close()
            s = None
            continue
        break
    if s is None:
        print('could not open socket')
        sys.exit(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.send(data)

    # Echo client program
    import socket
    import sys

    HOST = 'daring.cwi.nl'    # The remote host
    PORT = 50007              # The same port as used by the server
    s = None
    for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
        af, socktype, proto, canonname, sa = res
        try:
            s = socket.socket(af, socktype, proto)
        except OSError as msg:
            s = None
            continue
        try:
            s.connect(sa)
        except OSError as msg:
            s.close()
            s = None
            continue
        break
    if s is None:
        print('could not open socket')
        sys.exit(1)
    with s:
        s.sendall(b'Hello, world')
        data = s.recv(1024)
    print('Received', repr(data))

다음 예제는 윈도우에서 원시(raw) 소켓으로 매우 간단한 네트워크 스니퍼를 작성하는 방법을 보여줍니다. 이 예제는 인터페이스를 수정하기 위해 관리자 권한이 필요합니다:

    import socket

    # the public network interface
    HOST = socket.gethostbyname(socket.gethostname())

    # create a raw socket and bind it to the public interface
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
    s.bind((HOST, 0))

    # Include IP headers
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

    # receive all packages
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

    # receive a package
    print(s.recvfrom(65565))

    # disabled promiscuous mode
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

다음 예제는 원시(raw) 소켓 프로토콜을 사용하여, 소켓 인터페이스를 사용하여 CAN 네트워크와 통신하는 방법을 보여줍니다. 대신 브로드캐스트 관리자 프로토콜로 CAN을 사용하려면, 소켓을 이렇게 여십시오:

    socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)

소켓을 바인드(`CAN_RAW`)하거나 연결(`CAN_BCM`)한 후, `socket.send()` 와 `socket.recv()` 연산(과 대응 연산)을 소켓 객체에 평소와 같이 사용할 수 있습니다.

이 마지막 예제는 특별한 권한이 필요할 수 있습니다:

    import socket
    import struct

    # CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)

    can_frame_fmt = "=IB3x8s"
    can_frame_size = struct.calcsize(can_frame_fmt)

    def build_can_frame(can_id, data):
        can_dlc = len(data)
        data = data.ljust(8, b'\x00')
        return struct.pack(can_frame_fmt, can_id, can_dlc, data)

    def dissect_can_frame(frame):
        can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
        return (can_id, can_dlc, data[:can_dlc])

    # create a raw socket and bind it to the 'vcan0' interface
    s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
    s.bind(('vcan0',))

    while True:
        cf, addr = s.recvfrom(can_frame_size)

        print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

        try:
            s.send(cf)
        except OSError:
            print('Error sending CAN frame')

        try:
            s.send(build_can_frame(0x01, b'\x01\x02\x03'))
        except OSError:
            print('Error sending CAN frame')

실행 간격이 너무 짧게 여러 번 예제를 실행하면 이 에러가 발생할 수 있습니다:

    OSError: [Errno 98] Address already in use

이것은 이전 실행이 소켓을 `TIME_WAIT` 상태로 남겨 두었고, 즉시 재사용할 수 없기 때문입니다.

이것을 방지하기 위해서 설정할 수 있는 `socket` 플래그 `socket.SO_REUSEADDR`가 있습니다:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((HOST, PORT))

`SO_REUSEADDR` 플래그는 자연스러운 시간제한이 만료되기를 기다리지 않고 `TIME_WAIT` 상태의 지역 소켓을 재사용하도록 커널에 알립니다.

더 보기

(C로 하는) 소켓 프로그래밍에 대한 소개는 다음 논문을 참조하십시오:

- An Introductory 4.3BSD Interprocess Communication Tutorial, Stuart Sechrest 저

- An Advanced 4.3BSD Interprocess Communication Tutorial, Samuel J. Leffler 외 저,

둘 다 유닉스 프로그래머 매뉴얼, 보충 문서 1 (섹션 PS1:7과 PS1:8)에 있습니다. 다양한 소켓 관련 시스템 호출에 대한 플랫폼별 레퍼런스 자료는 소켓 의미의 세부 정보에 대한 중요한 소스입니다. 유닉스에서는 매뉴얼 페이지를 참조하십시오; 윈도우에서는, WinSock (또는 Winsock 2) 명세를 참조하십시오. IPv6 지원 API의 경우, 독자는 Basic Socket Interface Extensions for IPv6라는 제목의 RFC 3493를 참조하고 싶을 겁니다.