socket — 저수준 네트워크 인터페이스¶
소스 코드: Lib/socket.py
이 모듈은 BSD socket 인터페이스에 대한 액세스를 제공합니다. 모든 현대 유닉스 시스템, 윈도우, MacOS, 그리고 아마 추가 플랫폼에서 사용할 수 있습니다.
참고
호출이 운영 체제 소켓 API로 이루어지기 때문에, 일부 동작은 플랫폼에 따라 다를 수 있습니다.
파이썬 인터페이스는 Unix 시스템 호출 및 라이브러리 인터페이스를 파이썬의 객체 지향 스타일로 직접 변환한 것입니다. 즉, socket() 함수는 다양한 소켓 시스템 호출을 구현하는 메서드를 가진 socket 객체 를 반환합니다. 매개변수 타입은 C 인터페이스보다 약간 더 높은 수준입니다. 파이썬 파일의 read() 및 write() 작업과 마찬가지로, 수신 시 작업에서는 버퍼 할당이 자동으로 이루어지며, 송신 시에는 버퍼 길이가 암시적으로 처리됩니다.
더 보기
- 모듈
socketserver 네트워크 서버 작성을 단순화하는 클래스.
- 모듈
ssl 소켓 객체용 TLS/SSL 래퍼.
소켓 패밀리¶
시스템과 빌드 옵션에 따라, 다양한 소켓 패밀리가 이 모듈에서 지원됩니다.
특정 소켓 객체가 요구하는 주소 형식은 소켓 객체를 만들 때 지정된 주소 패밀리에 따라 자동으로 선택됩니다. 소켓 주소는 다음과 같이 표현됩니다:
파일 시스템 노드에 바인드 된
AF_UNIX소켓의 주소는 파일 시스템 인코딩과'surrogateescape'에러 처리기(PEP 383을 참조하세요)를 사용하는 문자열로 표현됩니다. 리눅스의 추상 이름 공간(abstract namespace)에 있는 주소는 처음에 널 바이트가 있는 바이트열류 객체로 반환됩니다; 이 이름 공간의 소켓은 일반 파일 시스템 소켓과 통신 할 수 있으므로, 리눅스에서 실행하려는 프로그램은 두 가지 유형의 주소를 모두 다뤄야 할 수도 있습니다. 문자열이나 바이트열류 객체는 인자로 전달할 때 두 가지 유형의 주소에 모두 사용할 수 있습니다.버전 3.3에서 변경: 이전에는,
AF_UNIX소켓 경로가 UTF-8 인코딩을 사용한다고 가정했습니다.버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.
AF_INET주소 패밀리에는(host, port)쌍이 사용되며, 여기서 host 는'daring.cwi.nl'과 같은 인터넷 도메인 표기법의 호스트 이름이나'100.50.200.5'와 같은 IPv4 주소를 나타내는 문자열이고, port 는 정수입니다.IPv4 주소의 경우, 호스트 주소 대신 두 개의 특수 형식이 허용됩니다:
''는 모든 인터페이스에 바인딩하는 데 사용되는INADDR_ANY를 나타내며'<broadcast>'문자열은INADDR_BROADCAST를 나타냅니다. 이 동작은 IPv6와 호환되지 않으므로, 여러분의 파이썬 프로그램에서 IPv6를 지원하려는 경우에는 이것들을 사용하지 않을 수 있습니다.
AF_INET6주소 패밀리에서는(host, port, flowinfo, scope_id)4-튜플이 사용되며, 여기서 flowinfo 와 scope_id 는 C의struct sockaddr_in6에 있는sin6_flowinfo및sin6_scope_id멤버를 나타냅니다.socket모듈 메서드의 경우, 하위 호환성을 위해 flowinfo 와 scope_id 를 생략할 수 있습니다. 그러나 scope_id 를 생략하면 범위(scoped)가 지정된 IPv6 주소를 조작하는 데 문제가 발생할 수 있음에 주의하십시오.버전 3.7에서 변경: 멀티캐스트 주소(의미 있는 scope_id를 가진)의 경우, address에는
%scope_id(또는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'과 같은 네트워크 인터페이스 이름을 나타내는 문자열입니다. 네트워크 인터페이스 이름''는 이 패밀리의 모든 네트워크 인터페이스에서 패킷을 수신하는 데 사용할 수 있습니다.PF_SYSTEM패밀리의SYSPROTO_CONTROL프로토콜에는 문자열이나 튜플(id, unit)이 사용됩니다. 문자열은 동적으로 할당된 ID를 사용하는 커널 제어의 이름입니다. 커널 제어의 ID와 유닛 번호를 알거나 등록된 ID를 사용하는 경우 튜플을 사용할 수 있습니다.Added in version 3.3.
AF_BLUETOOTH는 다음 프로토콜 및 주소 형식을 지원합니다:BTPROTO_L2CAP`은 다음과 같은 튜플을 수락합니다: ``(bdaddr, psm[, cid[, bdaddr_type]])`.bdaddr은 블루투스 주소를 명시하는 문자열입니다.psm은 프로토콜/서비스 멀티플렉서를 나타내는 정수입니다.cid는 채널 식별자(Channel Identifier)를 지정하는 선택적 정수입니다. 제공되지 않으면 기본값은 0입니다.bdaddr_type은 주소 유형을 지정하는 선택적 정수입니다. 가능한 값은BDADDR_BREDR(기본값),BDADDR_LE_PUBLIC,BDADDR_LE_RANDOM중 하나입니다.
버전 3.14에서 변경:
cid및bdaddr_type필드를 추가했습니다.BTPROTO_RFCOMM은(bdaddr, channel)를 받아들입니다. 여기서bdaddr은 문자열 블루투스 주소이고channel은 정수입니다.BTPROTO_HCI는 운영체제에 따라 다른 형식을 허용합니다.Linux에서는 정수
device_id또는 튜플(device_id, [channel])을 허용합니다. 여기서device_id는 Bluetooth 장치 번호를 지정하며,channel은 HCI 채널을 지정하는 선택적 정수입니다(기본값:HCI_CHANNEL_RAW).FreeBSD, NetBSD 및 DragonFly BSD에서는 문자열 형태의 Bluetooth 주소인
bdaddr을 허용합니다.
버전 3.2에서 변경: NetBSD 및 DragonFlyBSD 지원이 추가되었습니다.
버전 3.13.3에서 변경: FreeBSD 지원이 추가되었습니다.
버전 3.14에서 변경:
channel필드를 추가했습니다. 이제 튜플에 포함되지 않은device_id도 허용됩니다.BTPROTO_SCO는 문자열 또는bytes객체인bdaddr(Bluetooth 주소)를 허용합니다. (예:'12:23:34:45:56:67'또는b'12:23:34:45:56:67')버전 3.14에서 변경: 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비트 정수입니다.
가용성: Linux >= 2.6.38.
일부 알고리즘 유형은 더 최신 버전의 커널을 요구합니다.
Added in version 3.6.
AF_VSOCK은 가상 기계와 호스트가 통신할 수 있게 합니다. 소켓은(CID, port)튜플로 표현되는데, 컨텍스트 ID 또는 CID와 port는 정수입니다.Added in version 3.7.
AF_PACKET은 네트워크 장치에 직접 연결되는 저수준 인터페이스입니다. 주소는 튜플(ifname, proto[, pkttype[, hatype[, addr]]])로 표현되며, 각 항목은 다음과 같습니다.ifname - 장치 이름을 지정하는 문자열
proto - 이더넷 프로토콜 번호입니다. 모든 프로토콜을 캡처하려면
ETH_P_ALL을 사용하거나, ETHERTYPE_* 상수들 중 하나 또는 다른 이더넷 프로토콜 번호를 사용할 수 있습니다.pkttype - 패킷 유형을 지정하는 선택적 정수.:
PACKET_HOST(기본값) - 로컬 호스트로 향하는 패킷.PACKET_BROADCAST- 물리 계층 브로드캐스트 패킷.PACKET_MULTICAST- 물리 계층 멀티캐스트 주소로 전송되는 패킷입니다.PACKET_OTHERHOST- 무차별 모드의 장치 관리자에 의해 포착된 다른 호스트로 향하는 패킷.PACKET_OUTGOING- 패킷 소켓으로 루프 백 된 로컬 호스트에서 시작된 패킷.
hatype - ARP 하드웨어 주소 유형을 지정하는 선택적 정수.
addr - 하드웨어 물리 주소를 지정하는 선택적 바이트열류 객체, 해석은 장치에 따라 다릅니다.
가용성: Linux >= 2.2.
AF_QIPCRTR는 Qualcomm 플랫폼의 코 프로세서에서 실행되는 서비스와 통신하기 위한 리눅스 전용 소켓 기반 인터페이스입니다. 주소 패밀리는(node, port)튜플로 표현되는데, node와 port는 음수가 아닌 정수입니다.가용성: Linux >= 4.7.
Added in version 3.8.
IPPROTO_UDPLITE는 UDP의 변형으로, 체크섬으로 커버되는 패킷 부분을 지정할 수 있습니다. 변경할 수 있는 두 개의 소켓 옵션이 추가되었습니다.self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)는 체크섬으로 커버되는 나가는 패킷 부분을 변경하고self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)는 너무 적은 데이터를 커버하는 패킷을 걸러냅니다. 두 경우 모두length는range(8, 2**16, 8)에 있어야합니다.이러한 소켓은 IPv4의 경우
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)또는 IPv6의 경우socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)로 구성되어야 합니다.가용성: Linux >= 2.6.20, FreeBSD >= 10.1
Added in version 3.9.
AF_HYPERV는 Hyper-V 호스트 및 게스트와 통신하기 위한 Windows 전용 소켓 기반 인터페이스입니다. 주소 패밀리는(vm_id, service_id)튜플로 표현되며, 여기서vm_id와service_id는 UUID 문자열입니다.vm_id는 가상 머신 식별자이며, 대상이 특정 가상 머신이 아닌 경우 알려진 VMID 값 중 하나를 사용합니다.socket에 정의된 알려진 VMID 상수는 다음과 같습니다.HV_GUID_ZEROHV_GUID_BROADCASTHV_GUID_WILDCARD- 자기 자신에게 바인드하고 모든 파티션으로부터의 연결을 수락하는 데 사용됩니다.HV_GUID_CHILDREN- 자기 자신에게 바인드하고 자식 파틴션으로부터의 연결을 수락하는 데 사용됩니다.HV_GUID_LOOPBACK- 자기 자신을 대상으로 사용할 때 사용됩니다.HV_GUID_PARENT- 바인드 시 사용하면 부모 파티션으로부터의 연결을 수락하고, 주소 대상으로 사용할 경우 부모 파티션에 연결됩니다.
service_id는 등록된 서비스의 서비스 식별자입니다.Added in version 3.12.
IPv4/v6 소켓 주소의 host 부분에 호스트 명을 사용하면, 파이썬이 DNS 결정에서 반환된 첫 번째 주소를 사용하기 때문에, 프로그램은 비결정적인 동작을 보일 수 있습니다. 소켓 주소는 DNS 결정 결과 및/또는 호스트 구성에 따라 실제 IPv4/v6 주소로 다르게 결정됩니다. 결정론적 동작을 위해서는 host 부분에 숫자 주소를 사용하십시오.
모든 오류는 예외를 발생시킵니다. 잘못된 인자 유형이나 메모리 부족 상황에서는 일반적인 예외가 발생할 수 있으며, 소켓 또는 주소 의미론과 관련된 오류는 OSError 또는 그 하위 클래스 중 하나를 발생시킵니다.
비 블로킹 모드는 setblocking()을 통해 지원됩니다. 시간제한을 기반으로 하는 일반화는 settimeout()을 통해 지원됩니다.
모듈 내용¶
모듈 socket 은 다음 요소들을 제공합니다.
예외¶
- 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¶
TimeoutError의 사용이 권장되지 않는(deprecated) 별칭입니다.OSError의 서브 클래스, 이 예외는 앞서settimeout()호출을 통해 (또는 묵시적으로setdefaulttimeout()를 통해) 시간제한이 활성화된 소켓에서 시간 초과가 일어날 때 발생합니다. 수반되는 값은 현재는 항상 “timed out” 값을 갖는 문자열입니다.버전 3.3에서 변경: 이 클래스는
OSError의 서브 클래스가 되었습니다.버전 3.10에서 변경: 이 클래스는
TimeoutError의 별칭으로 설정되었습니다.
상수¶
AF_* 와 SOCK_* 상수는 이제 AddressFamily 와 SocketKind IntEnum 컬렉션입니다.
Added in version 3.4.
- socket.AF_UNIX¶
- socket.AF_INET¶
- socket.AF_INET6¶
이 상수들은 주소(및 프로토콜) 패밀리를 나타내며,
socket()의 첫 번째 인자로 사용됩니다. 만약AF_UNIX상수가 정의되어 있지 않다면 해당 프로토콜은 지원되지 않습니다. 시스템에 따라 더 많은 상수가 제공될 수 있습니다.
- socket.AF_UNSPEC¶
AF_UNSPEC은getaddrinfo()가 사용할 수 있는 모든 주소 패밀리(IPv4, IPv6 또는 기타 등)에 대한 소켓 주소를 반환해야 함을 의미합니다.
- 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 for a more thorough explanation.
가용성: Linux >= 2.6.27.
Added in version 3.2.
- SO_*
- socket.SOMAXCONN¶
- MSG_*
- SOL_*
- SCM_*
- IPPROTO_*
- IPPORT_*
- INADDR_*
- IP_*
- IPV6_*
- EAI_*
- AI_*
- NI_*
- TCP_*
Unix 소켓 또는 IP 프로토콜 문서에 설명된 이러한 형식의 많은 상수가 소켓 모듈에도 정의되어 있습니다. 이들은 일반적으로 소켓 객체의
setsockopt()및getsockopt()메서드의 인자로 사용됩니다. 대부분의 경우 Unix 헤더 파일에 정의된 심볼만 포함되며, 일부 심볼에 대해서는 기본값이 제공됩니다.버전 3.6에서 변경:
SO_DOMAIN,SO_PROTOCOL,SO_PEERSEC,SO_PASSSEC,TCP_USER_TIMEOUT,TCP_CONGESTION가 추가되었습니다.버전 3.6.5에서 변경: Windows 플랫폼에서 사용 가능한 경우
TCP_FASTOPEN및TCP_KEEPCNT지원을 추가했습니다.버전 3.7에서 변경:
TCP_NOTSENT_LOWAT가 추가되었습니다.Windows 플랫폼에서 사용 가능한 경우
TCP_KEEPIDLE및TCP_KEEPINTVL지원을 추가했습니다.버전 3.10에서 변경:
IP_RECVTOS가 추가되었습니다. 또한TCP_KEEPALIVE가 추가되었습니다. MacOS에서 이 상수는 Linux에서TCP_KEEPIDLE이 사용되는 것과 동일한 방식으로 사용할 수 있습니다.버전 3.11에서 변경:
TCP_CONNECTION_INFO가 추가되었습니다. MacOS에서 이 상수는 Linux 및 BSD에서TCP_INFO가 사용되는 것과 동일한 방식으로 사용할 수 있습니다.버전 3.12에서 변경:
SO_RTABLE및SO_USER_COOKIE가 추가되었습니다. OpenBSD와 FreeBSD에서 각각 이 상수들은 Linux에서SO_MARK가 사용되는 것과 동일한 방식으로 사용할 수 있습니다. 또한 Linux의 누락된 TCP 소켓 옵션들인TCP_MD5SIG,TCP_THIN_LINEAR_TIMEOUTS,TCP_THIN_DUPACK,TCP_REPAIR,TCP_REPAIR_QUEUE,TCP_QUEUE_SEQ,TCP_REPAIR_OPTIONS,TCP_TIMESTAMP,TCP_CC_INFO,TCP_SAVE_SYN,TCP_SAVED_SYN,TCP_REPAIR_WINDOW,TCP_FASTOPEN_CONNECT,TCP_ULP,TCP_MD5SIG_EXT,TCP_FASTOPEN_KEY,TCP_FASTOPEN_NO_COOKIE,TCP_ZEROCOPY_RECEIVE,TCP_INQ,TCP_TX_DELAY를 추가했습니다. 또한IP_PKTINFO,IP_UNBLOCK_SOURCE,IP_BLOCK_SOURCE,IP_ADD_SOURCE_MEMBERSHIP,IP_DROP_SOURCE_MEMBERSHIP을 추가했습니다.버전 3.13에서 변경:
SO_BINDTOIFINDEX가 추가되었습니다. Linux에서 이 상수는SO_BINDTODEVICE와 동일한 방식으로 사용될 수 있으나, 네트워크 인터페이스 이름 대신 인덱스를 사용합니다.버전 3.14에서 변경: Linux에서 누락된
IP_FREEBIND,IP_RECVERR,IPV6_RECVERR,IP_RECVTTL및IP_RECVORIGDSTADDR를 추가했습니다.버전 3.14에서 변경: Windows 플랫폼에서 사용 가능한 경우
TCP_QUICKACK지원을 추가했습니다.버전 3.15에서 변경:
IPV6_HDRINCL``이 추가되었습니다. 또한 Linux 플랫폼에서 사용 가능한 경우 ``SO_PASSRIGHTS지원을 추가했습니다.
- socket.AF_CAN¶
- socket.PF_CAN¶
- SOL_CAN_*
- CAN_*
리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.
가용성: Linux >= 2.6.25, NetBSD >= 8.
Added in version 3.3.
버전 3.11에서 변경: NetBSD 지원이 추가되었습니다.
버전 3.14에서 변경: Linux에서 누락된
CAN_RAW_ERR_FILTER를 복구했습니다.
- socket.CAN_BCM¶
- CAN_BCM_*
CAN 프로토콜 패밀리에서 CAN_BCM은 브로드캐스트 관리자 (Broadcast Manager, BCM) 프로토콜입니다. 리눅스 설명서에서 설명된 브로드캐스트 관리자 상수도 소켓 모듈에 정의되어 있습니다.
가용성: Linux >= 2.6.25.
참고
CAN_BCM_CAN_FD_FRAME플래그는 리눅스 >= 4.8 에서만 사용 가능합니다.Added in version 3.4.
- socket.CAN_RAW_FD_FRAMES¶
CAN_RAW 소켓에서 CAN FD 지원을 활성화합니다. 기본적으로 비활성화되어 있습니다. 여러분의 응용 프로그램이 CAN과 CAN FD 프레임을 모두 보낼 수 있도록 합니다; 그러나 소켓에서 읽을 때 CAN과 CAN FD 프레임을 모두 받아들여야 합니다.
이 상수는 리눅스 설명서에 설명되어 있습니다.
가용성: Linux >= 3.6.
Added in version 3.5.
- socket.CAN_RAW_JOIN_FILTERS¶
주어진 모든 CAN 필터와 일치하는 CAN 프레임 만 사용자 공간으로 전달되도록 적용된 CAN 필터를 결합합니다.
이 상수는 리눅스 설명서에 설명되어 있습니다.
가용성: Linux >= 4.1.
Added in version 3.9.
- socket.CAN_ISOTP¶
CAN 프로토콜 패밀리의 CAN_ISOTP는 ISO-TP (ISO 15765-2) 프로토콜입니다. ISO-TP 상수는 리눅스 설명서에 설명되어 있습니다.
가용성: Linux >= 2.6.25.
Added in version 3.7.
- socket.CAN_J1939¶
CAN 프로토콜 패밀리의 CAN_J1939는 SAE J1939 프로토콜입니다. J1939 상수는 리눅스 설명서에 설명되어 있습니다.
가용성: Linux >= 5.4.
Added in version 3.9.
- socket.AF_DIVERT¶
- socket.PF_DIVERT¶
FreeBSD divert(4) 매뉴얼 페이지에 설명된 이 두 상수는 소켓 모듈에도 정의되어 있습니다.
가용성: FreeBSD >= 14.0.
Added in version 3.12.
- socket.AF_PACKET¶
- socket.PF_PACKET¶
- PACKET_*
리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.
가용성: Linux >= 2.2.
- socket.ETH_P_ALL¶
ETH_P_ALLcan be used in thesocketconstructor as proto for theAF_PACKETfamily in order to capture every packet, regardless of protocol.자세한 정보는 packet(7) 매뉴얼 페이지를 참조하십시오.
가용성: Linux.
Added in version 3.12.
- socket.AF_RDS¶
- socket.PF_RDS¶
- socket.SOL_RDS¶
- RDS_*
리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.
가용성: Linux >= 2.6.30.
Added in version 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_VSOCK¶
- socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID¶
- VMADDR*
- SO_VM*
리눅스 호스트/게스트 통신용 상수.
가용성: Linux >= 4.8.
Added in version 3.7.
- socket.has_ipv6¶
이 상수는 이 플랫폼에서 IPv6가 지원되는지를 나타내는 논릿값을 포함합니다.
- socket.AF_BLUETOOTH¶
- socket.BTPROTO_L2CAP¶
- socket.BTPROTO_RFCOMM¶
- socket.BTPROTO_HCI¶
- socket.BTPROTO_SCO¶
Bluetooth 주소와 함께 사용하는 정수 상수들입니다.
- socket.BDADDR_ANY¶
- socket.BDADDR_LOCAL¶
이들은 특수한 의미를 지닌 블루투스 주소를 포함하는 문자열 상수입니다. 예를 들어,
BDADDR_ANY는 바인딩 소켓을BTPROTO_RFCOMM로 지정할 때 임의의(any) 주소를 나타내는 데 사용할 수 있습니다.
- socket.BDADDR_BREDR¶
- socket.BDADDR_LE_PUBLIC¶
- socket.BDADDR_LE_RANDOM¶
이 상수들은
BTPROTO_L2CAP소켓을 바인드하거나 연결할 때의 Bluetooth 주소 유형을 설명합니다.가용성: Linux, FreeBSD
Added in version 3.14.
- socket.SOL_RFCOMM¶
- socket.SOL_L2CAP¶
- socket.SOL_HCI¶
- socket.SOL_SCO¶
- socket.SOL_BLUETOOTH¶
Bluetooth 소켓 객체의
setsockopt()및getsockopt()메서드에서 수준(level) 인자로 사용됩니다.SOL_BLUETOOTH는 Linux에서만 사용할 수 있습니다. 다른 상수들은 해당 프로토콜이 지원되는 경우에 사용할 수 있습니다.
- SO_L2CAP_*
- socket.L2CAP_LM¶
- L2CAP_LM_*
- SO_RFCOMM_*
- RFCOMM_LM_*
- SO_SCO_*
- SO_BTH_*
- BT_*
Bluetooth 소켓 객체의
setsockopt()및getsockopt()메서드에서 옵션 이름과 값 인자로 사용됩니다.BT_*와L2CAP_LM은 Linux에서만 사용 가능하며,SO_BTH_*는 Windows에서만 사용할 수 있습니다. 다른 상수들은 Linux 및 다양한 BSD 플랫폼에서 제공될 수 있습니다.Added in version 3.14.
- socket.HCI_FILTER¶
- socket.HCI_TIME_STAMP¶
- socket.HCI_DATA_DIR¶
- socket.SO_HCI_EVT_FILTER¶
- socket.SO_HCI_PKT_FILTER¶
BTPROTO_HCI와 함께 사용하는 옵션 이름입니다. 옵션 값의 가용성 및 형식은 플랫폼에 따라 다릅니다.버전 3.14에서 변경: NetBSD 및 DragonFly BSD에서
SO_HCI_EVT_FILTER와SO_HCI_PKT_FILTER를 추가했습니다. 또한 FreeBSD, NetBSD 및 DragonFly BSD에서HCI_DATA_DIR을 추가했습니다.
- socket.HCI_DEV_NONE¶
단일 Bluetooth 어댑터에 고정되지 않은 HCI 소켓을 생성하는 데 사용되는
device_id값입니다.가용성: Linux
Added in version 3.14.
- socket.HCI_CHANNEL_RAW¶
- socket.HCI_CHANNEL_USER¶
- socket.HCI_CHANNEL_MONITOR¶
- socket.HCI_CHANNEL_CONTROL¶
- socket.HCI_CHANNEL_LOGGING¶
BTPROTO_HCI주소의channel필드에 대한 가능한 값들입니다.가용성: Linux
Added in version 3.14.
- socket.SCM_CREDS2¶
- socket.LOCAL_CREDS¶
- socket.LOCAL_CREDS_PERSISTENT¶
LOCAL_CREDS 및 LOCAL_CREDS_PERSISTENT는 SOCK_DGRAM 및 SOCK_STREAM 소켓과 함께 사용될 수 있으며, 이는 Linux/DragonFlyBSD의 SO_PASSCRED와 동일합니다. LOCAL_CREDS은 첫 번째 읽기 시에 자격 증명을 보내고, LOCAL_CREDS_PERSISTENT는 매 읽기마다 자격 증명을 보냅니다. 후자의 경우 메시지 유형을 위해 SCM_CREDS2를 사용해야 합니다.
Added in version 3.11.
가용성: FreeBSD.
- socket.SO_INCOMING_CPU¶
SO_REUSEPORT와 함께 사용하여 CPU 지역성(locality)을 최적화하는 상수입니다.Added in version 3.11.
가용성: Linux >= 3.9
- socket.SO_REUSEPORT_LB¶
로드 밸런싱과 함께 중복된 주소 및 포트 바인딩을 허용하기 위한 상수입니다.
Added in version 3.14.
가용성: FreeBSD >= 12.0
- socket.AF_HYPERV¶
- socket.HV_PROTOCOL_RAW¶
- socket.HVSOCKET_CONNECT_TIMEOUT¶
- socket.HVSOCKET_CONNECT_TIMEOUT_MAX¶
- socket.HVSOCKET_CONNECTED_SUSPEND¶
- socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU¶
- socket.HV_GUID_ZERO¶
- socket.HV_GUID_WILDCARD¶
- socket.HV_GUID_BROADCAST¶
- socket.HV_GUID_CHILDREN¶
- socket.HV_GUID_LOOPBACK¶
- socket.HV_GUID_PARENT¶
호스트/게스트 통신을 위한 Windows Hyper-V 소켓 관련 상수입니다.
가용성: Windows.
Added in version 3.12.
- socket.ETHERTYPE_ARP¶
- socket.ETHERTYPE_IP¶
- socket.ETHERTYPE_IPV6¶
- socket.ETHERTYPE_VLAN¶
IEEE 802.3 프로토콜 번호 상수입니다.
가용성: Linux, FreeBSD, macOS.
Added in version 3.12.
- socket.SHUT_RD¶
- socket.SHUT_WR¶
- socket.SHUT_RDWR¶
이 상수들은 소켓 객체의
shutdown()메서드에 의해 사용됩니다.가용성: not WASI.
함수¶
소켓 만들기¶
다음 함수는 모두 소켓 객체를 만듭니다.
socket 클래스 생성자는 새로운 소켓을 직접 생성합니다. 매개변수와 전체 설명은 소켓 객체 를 참조하십시오.
- socket.socketpair([family[, type[, proto]]])¶
주어진 주소 패밀리, 소켓 유형 및 프로토콜 번호를 사용하여 연결된 소켓 객체 쌍을 생성합니다. 주소 패밀리, 소켓 유형 및 프로토콜 번호는
socket()함수와 동일합니다. 기본 패밀리는 플랫폼에 정의되어 있다면AF_UNIX이며, 그렇지 않으면 기본값은AF_INET입니다.새로 만들어진 소켓은 상속 불가능합니다.
버전 3.2에서 변경: 반환된 소켓 객체는 이제 부분 집합이 아닌 전체 소켓 API를 지원합니다.
버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.
버전 3.5에서 변경: 윈도우 지원이 추가되었습니다.
- socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)¶
인터넷 address (2-튜플
(host, port))에서 리스닝 중인 TCP 서비스에 연결하고 소켓 객체를 반환합니다. 이 함수는socket.connect()보다 높은 수준의 함수입니다. 만약 host 가 숫자가 아닌 호스트네임이면,AF_INET및AF_INET6모두에 대해 해석(resolve)을 시도한 다음, 연결이 성공할 때까지 가능한 모든 주소에 순차적으로 연결을 시도합니다. 이를 통해 IPv4와 IPv6를 모두 지원하는 클라이언트를 쉽게 작성할 수 있습니다.선택적 timeout 매개 변수를 전달하면 연결을 시도하기 전에 소켓 인스턴스의 시간제한을 설정합니다. timeout이 제공되지 않으면,
getdefaulttimeout()에 의해 반환된 전역 기본 시간제한 설정이 사용됩니다.제공되면, source_address는 연결하기 전에 소켓이 소스 주소로 바인드 할 2-튜플
(host, port)여야 합니다. 호스트나 포트가 각각 ‘’ 나 0이면 OS 기본 동작이 사용됩니다.연결을 생성할 수 없는 경우 예외가 발생합니다. 기본적으로 리스트의 마지막 주소에서 발생한 예외가 전달됩니다. 만약 all_errors 가
True이면, 모든 시도에서 발생한 오류를 포함하는ExceptionGroup이 반환됩니다.버전 3.2에서 변경: source_address가 추가되었습니다.
버전 3.11에서 변경: all_errors 매개 변수가 추가되었습니다.
- socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)¶
address (2-튜플
(host, port))에 바인드된 TCP 소켓을 생성하고 소켓 객체를 반환하는 편의 함수입니다.family 는
AF_INET또는AF_INET6중 하나여야 합니다. backlog 는socket.listen()에 전달되는 큐 크기이며, 지정되지 않으면 적절한 기본값이 선택됩니다. reuse_port 는SO_REUSEPORT소켓 옵션을 설정할지 여부를 결정합니다.dualstack_ipv6 가 true이고, family 가
AF_INET6이며 플랫폼이 이를 지원하는 경우 소켓은 IPv4와 IPv6 연결을 모두 수락할 수 있으며, 그렇지 않으면ValueError를 발생시킵니다. 대부분의 POSIX 플랫폼과 Windows는 이 기능을 지원합니다. 이 기능이 활성화된 상태에서 IPv4 연결이 발생할 때socket.getpeername()에 의해 반환되는 주소는 IPv4-mapped IPv6 주소로 표현된 IPv6 주소가 됩니다. dualstack_ipv6 가 false이면 이를 기본으로 활성화하는 플랫폼(예: Linux)에서 이 기능을 명시적으로 비활성화합니다. 이 파라미터는has_dualstack_ipv6()와 함께 사용할 수 있습니다.import socket addr = ("", 8080) # 모든 인터페이스, 포트 8080 if socket.has_dualstack_ipv6(): s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True) else: s = socket.create_server(addr)
참고
POSIX 플랫폼에서
SO_REUSEADDR소켓 옵션은 같은 address에 바인드 되었고 TIME_WAIT 상태로 남아 있던 이전 소켓을 즉시 재사용하기 위해 설정됩니다.Added in version 3.8.
- socket.has_dualstack_ipv6()¶
플랫폼이 IPv4와 IPv6 연결을 모두 처리할 수 있는 TCP 소켓을 만드는 것을 지원하면
True를 반환합니다.Added in version 3.8.
- socket.fromfd(fd, family, type, proto=0)¶
파일 기술자 fd (파일 객체의
fileno()메서드에 의해 반환된 정수)를 복제하고 그 결과로 소켓 객체를 생성합니다. 주소 패밀리, 소켓 유형 및 프로토콜 번호는socket()함수와 동일합니다. 파일 기술자는 소켓을 참조해야 하지만 이는 확인되지 않으며, 파일 기술자가 유효하지 않을 경우 해당 객체에 대한 후속 작업이 실패할 수 있습니다. 이 함수는 드물게 필요하지만, 표준 입력이나 출력으로 프로그램에 전달된 소켓(Unix inet 데몬에 의해 시작된 서버 등)의 소켓 옵션을 설정하거나 가져올 때 사용할 수 있습니다. 소켓은 차단(blocking) 모드인 것으로 간음됩니다.새로 만들어진 소켓은 상속 불가능합니다.
버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.
socket.share()메서드에서 얻은 데이터로 소켓의 인스턴스를 만듭니다. 소켓은 블로킹 모드로 간주합니다.가용성: Windows.
Added in version 3.3.
기타 함수¶
socket 모듈은 또한 다양한 네트워크 관련 서비스를 제공합니다:
- socket.close(fd)¶
소켓 파일 기술자를 닫습니다. 이는
os.close()와 유사하지만 소켓 전용입니다. 일부 플랫폼(가장 대표적인 것은 Windows)에서os.close()는 소켓 파일 기술자에 대해 작동하지 않습니다.Added in version 3.7.
- socket.getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)¶
이 함수는 하위 시스템의 C 함수인
getaddrinfo를 래핑합니다.host/port 인자를 해당 서비스에 연결된 소켓을 만드는 데 필요한 모든 인자가 들어있는 5-튜플의 시퀀스로 변환합니다. host는 도메인 이름, IPv4/v6 주소의 문자열 표현 또는
None입니다. port는'http'와 같은 문자열 서비스 이름, 숫자 포트 번호 또는None입니다.None을 host 와 port의 값으로 전달해서,NULL을 하부 C API에 전달할 수 있습니다.family, type 및 proto 인자는 옵션을 제공하고 반환되는 주소 목록을 제한하기 위해 선택적으로 지정할 수 있습니다. 결과를 제한하지 않으려면 각각의 기본값(
AF_UNSPEC, 0, 0)을 전달하십시오. 자세한 내용은 아래의 참고 사항을 확인하십시오.flags 인자는 여러 개의
AI_*상수 중 하나 이상이 될 수 있으며 결과가 계산되고 반환되는 방식에 영향을 줍니다. 예를 들어,AI_NUMERICHOST는 도메인 이름 해석을 비활성화하며, host 가 도메인 이름인 경우 에러를 발생시킵니다.이 함수는 다음과 같은 구조의 5-튜플의 리스트를 반환합니다:
(family, type, proto, canonname, sockaddr)이 튜플에서 family, type, proto 는 모두 정수이며
socket()함수에 전달되는 용도입니다. canonname 은 flags 인자에AI_CANONNAME이 포함된 경우 host 의 표준 명칭을 나타내는 문자열이 되며, 그렇지 않으면 빈 값으로 설정됩니다. sockaddr 은 소켓 주소를 설명하는 튜플이며, 그 형식은 반환된 family 와 Python이 빌드될 때 사용된 플래그에 따라 달라지며socket.connect()메서드에 전달되는 용도입니다.sockaddr 은 다음 중 하나일 수 있습니다:
AF_INET`의 경우 ``(address, port)`2-튜플Python이
--enable-ipv6로 빌드된 경우(기본값),AF_INET6의 경우(address, port, flowinfo, scope_id)4-튜플Python이
--disable-ipv6로 빌드된 경우,AF_INET6의 경우 로우 데이터를 포함하는 2-튜플
참고
getaddrinfo()의 결과를 소켓 생성에 사용하려는 경우(예를 들어, canonname 을 가져오는 대신), 애플리케이션이 처리할 수 있는 type (예:SOCK_STREAM또는SOCK_DGRAM) 및/또는 proto (예:IPPROTO_TCP또는IPPROTO_UDP)로 결과를 제한하는 것을 고려하십시오.family, type, proto 및 flags 의 기본값에 따른 동작은 시스템에 따라 다릅니다.
많은 시스템(예: 대부분의 Linux 구성)은 일치하는 모든 주소에 대한 정렬된 목록을 반환합니다. 이러한 경우에는 일반적으로 연결이 성공할 때까지 순차적으로 해당 주소들을 시도해야 하며, 필요에 따라 병렬로 시도할 수도 있습니다(예: Happy Eyeballs 알고리즘 사용). 이 경우 type 및/또는 proto 를 제한하면 실패하거나 사용할 수 없는 연결 시도를 줄이는 데 도움이 됩니다.
그러나 일부 시스템에서는 단 하나의 주소만 반환할 수도 있습니다.(예: Solaris 및 AIX 구성에서 보고됨) 이러한 시스템에서는 type 및/또는 proto 를 제한함으로써 해당 주소가 사용 가능한지 보장하는 데 도움이 됩니다.
host,port,family,type,protocol을 인자로 감사 이벤트(auditing event)socket.getaddrinfo를 발생시킵니다.다음 예제는
example.org의 포트 80으로 가는 가상의 TCP 연결에 대한 주소 정보를 가져옵니다 (IPv6가 활성화되지 않았으면 여러분의 시스템에서는 결과가 다를 수 있습니다):>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP) [(socket.AF_INET6, socket.SOCK_STREAM, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (socket.AF_INET, socket.SOCK_STREAM, 6, '', ('93.184.216.34', 80))]
버전 3.2에서 변경: 매개 변수는 이제 키워드 인자를 사용하여 전달할 수 있습니다.
버전 3.7에서 변경: IPv6 멀티캐스트 주소의 경우, 주소를 나타내는 문자열에는
%scope_id부분이 포함되지 않습니다.
- socket.getfqdn([name])¶
name 에 대한 완전한 정규화된 도메인 이름(FQDN)을 반환합니다. name 이 생략되었거나 비어 있으면 로컬 호스트로 해석됩니다. 전체 이름을 찾기 위해
gethostbyaddr()가 반환하는 호스트네임을 확인하고, 사용 가능한 경우 해당 호스트의 별칭을 확인합니다. 점(.)이 포함된 첫 번째 이름을 선택합니다. 전체 이름이 제공되지 않는데 name 이 입력된 경우에는 그대로 반환합니다. name 이 비어 있거나'0.0.0.0'과 같은 경우,gethostname()에서 얻은 호스트네임을 반환합니다.
- socket.gethostbyname(hostname)¶
호스트 이름을 IPv4 주소 형식으로 변환합니다. IPv4 주소는
'100.50.200.5'와 같은 문자열로 반환됩니다. 호스트 이름이 IPv4 주소면 변경되지 않고 반환됩니다. 더욱 완전한 인터페이스는gethostbyname_ex()를 참조하십시오.gethostbyname()는 IPv6 이름 결정을 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신getaddrinfo()를 사용해야 합니다.hostname을 인자로 감사 이벤트(auditing event)socket.gethostbyname을 발생시킵니다.가용성: not WASI.
- socket.gethostbyname_ex(hostname)¶
호스트네임을 확장 인터페이스의 IPv4 주소 형식으로 변환합니다. hostname 이 호스트의 기본 호스트네임, aliaslist 가 동일한 주소에 대한 대체 호스트네임 목록(비어 있을 수 있음), ipaddrlist 가 동일한 호스트의 동일한 인터페이스에 대한 IPv4 주소 목록(종종 단일 주소이지만 항상 그렇지는 않음)을 포함하는 3-튜플
(hostname, aliaslist, ipaddrlist)를 반환합니다.gethostbyname_ex()는 IPv6 이름 결정을 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신getaddrinfo()를 사용해야 합니다.hostname을 인자로 감사 이벤트(auditing event)socket.gethostbyname을 발생시킵니다.가용성: not WASI.
- socket.gethostname()¶
파이썬 인터프리터가 현재 실행 중인 기계의 호스트 명을 포함한 문자열을 반환합니다.
인자 없이 감사 이벤트(auditing event)
socket.gethostname을 발생시킵니다.참고:
gethostname()은 항상 완전히 정규화된 도메인 이름을 반환하지는 않습니다; 원한다면getfqdn()을 사용하십시오.가용성: not WASI.
- socket.gethostbyaddr(ip_address)¶
hostname 이 주어진 ip_address 에 응답하는 기본 호스트네임, aliaslist 가 동일한 주소에 대한 대체 호스트네임 목록(비어 있을 수 있음), ipaddrlist 가 동일한 호스트의 동일한 인터페이스에 대한 IPv4/v6 주소 목록(대부분 단일 주소 포함)을 포함하는 3-튜플
(hostname, aliaslist, ipaddrlist)를 반환합니다. 완전한 정규화된 도메인 이름을 찾으려면getfqdn()함수를 사용하십시오.gethostbyaddr()은 IPv4 및 IPv6를 모두 지원합니다.ip_address를 인자로 감사 이벤트(auditing event)socket.gethostbyaddr을 발생시킵니다.가용성: not WASI.
- socket.getnameinfo(sockaddr, flags)¶
소켓 주소 sockaddr 을 2-튜플
(host, port)로 변환합니다. flags 설정에 따라 host 에 완전한 정규화된 도메인 이름 또는 숫자 기반 주소 표현이 포함될 수 있습니다. 마찬가지로 port 는 문자열 포트 이름이나 숫자 포트 번호를 포함할 수 있습니다.IPv6 주소의 경우, sockaddr에 의미 있는 scope_id가 있으면
%scope_id를 host 부분에 덧붙입니다. 보통 이것은 멀티캐스트 주소에서 일어납니다.flags에 대한 자세한 내용은 getnameinfo(3)을 참조하십시오.
sockaddr을 인자로 감사 이벤트(auditing event)socket.getnameinfo를 발생시킵니다.가용성: not WASI.
- socket.getprotobyname(protocolname)¶
인터넷 프로토콜 이름(예:
'icmp')을socket()함수의 (선택적) 세 번째 인자로 전달하기에 적합한 상수로 변환합니다. 이는 일반적으로 “raw” 모드(SOCK_RAW)로 열린 소켓에서만 필요하며, 일반적인 소켓 모드에서는 프로토콜이 생략되거나 0이면 올바른 프로토콜이 자동으로 선택됩니다.가용성: not WASI.
- socket.getservbyname(servicename[, protocolname])¶
인터넷 서비스 이름과 프로토콜 이름을 해당 서비스의 포트 번호로 변환합니다. 제공되는 경우 선택적인 프로토콜 이름은
'tcp'또는'udp'여야 하며, 그렇지 않으면 모든 프로토콜이 매칭됩니다.servicename,protocolname을 인자로 감사 이벤트(auditing event)socket.getservbyname을 발생시킵니다.가용성: not WASI.
- socket.getservbyport(port[, protocolname])¶
인터넷 포트 번호와 프로토콜 이름을 해당 서비스의 이름으로 변환합니다. 제공되는 경우 선택적인 프로토콜 이름은
'tcp'또는'udp'여야 하며, 그렇지 않으면 모든 프로토콜이 매칭됩니다.port,protocolname을 인자로 감사 이벤트(auditing event)socket.getservbyport를 발생시킵니다.가용성: not WASI.
- socket.ntohl(x)¶
32비트 양의 정수를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 4바이트 스와프 연산을 수행합니다.
- socket.ntohs(x)¶
16비트 양의 정수를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 2바이트 스와프 연산을 수행합니다.
버전 3.10에서 변경: x 가 16비트 부호 없는 정수(unsigned integer)에 들어맞지 않으면
OverflowError를 발생시킵니다.
- socket.htonl(x)¶
32비트 양의 정수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 4바이트 스와프 연산을 수행합니다.
- socket.htons(x)¶
16비트 양의 정수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 2바이트 스와프 연산을 수행합니다.
버전 3.10에서 변경: x 가 16비트 부호 없는 정수(unsigned integer)에 들어맞지 않으면
OverflowError를 발생시킵니다.
- socket.inet_aton(ip_string)¶
IPv4 주소를 점으로 구분된 사분면(dotted-quad) 문자열 형식(예: ‘123.45.67.89’)에서 길이가 4자인 바이트 객체 형태의 32비트 패킹된 이진 형식으로 변환합니다. 이는 표준 C 라이브러리를 사용하며 이 함수가 반환하는 32비트 패킹된 이진 데이터의 C 타입인
in_addr유형의 객체가 필요한 프로그램과 통신할 때 유용합니다.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바이트인 bytes-like object)를 표준 점 구분 문자열 표현(예: ‘123.45.67.89’)으로 변환합니다. 이는 표준 C 라이브러리를 사용하며 이 함수가 인자로 받는 32비트 패킹된 이진 데이터의 C 타입인
in_addr유형의 객체가 필요한 프로그램과 통신할 때 유용합니다.이 함수에 전달된 바이트 시퀀스가 정확히 4바이트 길이가 아니면,
OSError가 발생합니다.inet_ntoa()는 IPv6를 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신inet_ntop()를 사용해야 합니다.버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.
- socket.inet_pton(address_family, ip_string)¶
IP 주소를 패밀리별 특정 문자열 형식에서 패킹된 이진 형식으로 변환합니다.
inet_pton()은 라이브러리나 네트워크 프로토콜이in_addr(예:inet_aton()과 유사함) 또는in6_addr타입의 객체를 요구할 때 유용합니다.address_family에 대해 지원되는 값은 현재
AF_INET과AF_INET6입니다. IP 주소 문자열 ip_string가 유효하지 않으면,OSError가 발생합니다. 정확히 무엇이 유효한지는 address_family의 값과inet_pton()의 하부 구현에 따라 달라집니다.가용성: Unix, Windows.
버전 3.4에서 변경: 윈도우 지원이 추가되었습니다
- socket.inet_ntop(address_family, packed_ip)¶
패킹된 IP 주소(임의의 바이트 수로 구성된 bytes-like object)를 표준 패밀리 특정 문자열 표현(예:
'7.10.0.5'또는'5aef:2b::8')으로 변환합니다.inet_ntop()은 라이브러리나 네트워크 프로토콜이in_addr(예:inet_ntoa()와 유사함) 또는in6_addr타입의 객체를 반환할 때 유용합니다.address_family에 대해 지원되는 값은 현재
AF_INET과AF_INET6입니다. 바이트열 객체 packed_ip가 지정된 주소 패밀리의 올바른 길이가 아니면,ValueError가 발생합니다.inet_ntop()호출로 인한 에러에는OSError가 발생합니다.가용성: Unix, Windows.
버전 3.4에서 변경: 윈도우 지원이 추가되었습니다
버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.
- socket.CMSG_LEN(length)¶
주어진 length의 연관된 데이터가 있는 보조(ancillary) 데이터 항목의 (후행 패딩을 제외한) 총 길이를 반환합니다. 이 값은
recvmsg()가 보조 데이터의 단일 항목을 수신하기 위한 버퍼 크기로 종종 사용될 수 있지만, RFC 3542는 이식성 있는 응용 프로그램에서CMSG_SPACE()를 사용하도록 요구하는데, 항목이 버퍼의 마지막 부분일 때도 패딩을 위한 공간을 포함합니다. length가 허용되는 값 범위를 벗어나면OverflowError를 발생시킵니다.가용성: Unix, not WASI.
대부분의 Unix 플랫폼.
Added in version 3.3.
- socket.CMSG_SPACE(length)¶
주어진 length의 연관된 데이터가 있는 보조(ancillary) 데이터 항목을 수신하기 위해
recvmsg()에 필요한 버퍼 크기를 반환하는데, 후행 패딩을 포함합니다. 여러 항목을 수신하는 데 필요한 버퍼 공간은 연관된 데이터 길이에 대한CMSG_SPACE()값의 합입니다. length가 허용되는 값 범위를 벗어나면OverflowError를 발생시킵니다.일부 시스템에서는 이 함수를 제공하지 않으면서 보조(ancillary) 데이터를 지원할 수 있음에 유의하십시오. 또한, 이 함수의 결과를 사용하여 버퍼 크기를 설정하면 수신할 수 있는 보조 데이터의 양이 정확하게 제한되지 않을 수 있음에도 유의하십시오. 추가 데이터가 패딩 영역에 들어갈 수 있기 때문입니다.
가용성: Unix, not WASI.
대부분의 Unix 플랫폼.
Added in version 3.3.
- socket.getdefaulttimeout()¶
새로운 소켓 객체의 기본 시간제한을 초 단위로 (float) 반환합니다.
None값은 새 소켓 객체가 시간제한이 없음을 나타냅니다. 소켓 모듈을 처음 임포트 할 때 기본값은None입니다.
- socket.setdefaulttimeout(timeout)¶
새 소켓 객체의 기본 시간 제한을 초(실수형) 단위로 설정합니다. 소켓 모듈을 처음 임포트할 때 기본값은
None입니다. 가능한 값과 각 의미는settimeout()를 참조하십시오.버전 3.15에서 변경: 정수나 실수뿐만 아니라 모든 실수를 수용합니다.
- socket.sethostname(name)¶
기계의 호스트 명을 name으로 설정합니다. 충분한 권한이 없으면
OSError가 발생합니다.name을 인자로 감사 이벤트(auditing event)socket.sethostname을 발생시킵니다.가용성: Unix, not Android.
Added in version 3.3.
- socket.if_nameindex()¶
네트워크 인터페이스 정보 (인덱스 정수, 이름 문자열) 튜플의 리스트를 반환합니다. 시스템 호출이 실패하면
OSError.가용성: Unix, Windows, not WASI.
Added in version 3.3.
버전 3.8에서 변경: 윈도우 지원이 추가되었습니다.
참고
윈도우에서 네트워크 인터페이스는 다른 문맥에서 다른 이름을 갖습니다 (모든 이름은 예입니다):
UUID:
{FB605B73-AAC2-49A6-9A2F-25416AEA0573}이름:
ethernet_32770친숙한 이름:
vEthernet (nat)설명:
Hyper-V Virtual Ethernet Adapter
이 함수는 목록에서 두 번째 형식의 이름을 반환합니다, 이 예의 경우
ethernet_32770.
- socket.if_nametoindex(if_name)¶
인터페이스 이름에 대응하는 네트워크 인터페이스 인덱스 번호를 반환합니다. 주어진 이름을 가진 인터페이스가 없으면
OSError.가용성: Unix, Windows, not WASI.
Added in version 3.3.
버전 3.8에서 변경: 윈도우 지원이 추가되었습니다.
더 보기
“인터페이스 이름”은
if_nameindex()에 설명된 이름입니다.
- socket.if_indextoname(if_index)¶
인터페이스 인덱스 번호에 해당하는 네트워크 인터페이스 이름을 반환합니다. 지정된 인덱스의 인터페이스가 없으면
OSError.가용성: Unix, Windows, not WASI.
Added in version 3.3.
버전 3.8에서 변경: 윈도우 지원이 추가되었습니다.
더 보기
“인터페이스 이름”은
if_nameindex()에 설명된 이름입니다.
소켓 객체¶
- class 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또는CAN_J1939중 하나여야 합니다.fileno 가 지정된 경우, family, type, proto 값은 지정된 파일 기술자에서 자동으로 감지됩니다. 자동 감지는 명시적 family, type 또는 proto 인수를 사용하여 함수 호출로 재정의할 수 있습니다. 이것은
socket.getpeername()의 반환 값 등을 Python이 표현하는 방식에만 영향을 미치며 실제 OS 리소스에는 영향을 미치지 않습니다.socket.fromfd()와 달리, fileno 는 사본이 아닌 동일한 소켓을 반환할 것입니다. 이는socket.close()를 사용하여 분리된 소켓을 닫는 데 도움이 될 수 있습니다.새로 만들어진 소켓은 상속 불가능합니다.
self,family,type,protocol를 인자로 감사 이벤트(auditing event)socket.__new__를 발생시킵니다.버전 3.3에서 변경: AF_CAN 패밀리가 추가되었습니다. AF_RDS 패밀리가 추가되었습니다.
버전 3.4에서 변경: CAN_BCM 프로토콜이 추가되었습니다.
버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.
버전 3.7에서 변경: CAN_ISOTP 프로토콜이 추가되었습니다.
버전 3.7에서 변경: type 에
SOCK_NONBLOCK또는SOCK_CLOEXEC비트 플래그가 적용되면 해당 플래그들이 제거되며,socket.type은 이를 반영하지 않습니다. 이들은 여전히 하부 시스템socket()호출에 전달됩니다. 따라서,sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
는 여전히
SOCK_NONBLOCK를 지원하는 OS에서 비 블로킹 소켓을 만들지만,sock.type은socket.SOCK_STREAM로 설정됩니다.버전 3.9에서 변경: CAN_J1939 프로토콜이 추가되었습니다.
버전 3.10에서 변경: IPPROTO_MPTCP 프로토콜이 추가되었습니다.
소켓 객체에는 다음과 같은 메서드가 있습니다.
makefile()를 제외하고, 이것들은 소켓에 적용할 수 있는 유닉스 시스템 호출에 해당합니다.- accept()¶
연결을 받아들입니다. 소켓은 주소에 바인드되어 연결을 리스닝하고 있어야 합니다. 반환 값은
(conn, address)쌍입니다. 여기서 conn는 연결에서 데이터를 보내고 받을 수 있는 새로운 소켓 객체이고, address는 연결의 다른 끝에 있는 소켓에 바인드 된 주소입니다.새로 만들어진 소켓은 상속 불가능합니다.
버전 3.4에서 변경: 소켓은 이제 상속 불가능합니다.
버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제
InterruptedError예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).
- bind(address)¶
소켓을 address 에 바인드합니다. 소켓은 이미 바인드되어 있으면 안 됩니다. address 의 형식은 주소 패밀리에 따라 다릅니다. — 소켓 패밀리 참조.
self,address을 인자로 감사 이벤트(auditing event)socket.bind를 발생시킵니다.가용성: not WASI.
- close()¶
Mark the socket closed. The underlying system resource (e.g. a file descriptor) is also closed when all file objects from
makefile()are closed. Once that happens, all future operations on the socket object will fail. The remote end will receive no more data (after queued data is flushed).소켓은 가비지 수집될 때 자동으로 닫히지만, 명시적으로
close()하거나with문을 사용하는 것이 좋습니다.버전 3.6에서 변경: 하부
close()호출 시 오류가 발생할 경우 이제OSError가 발생합니다.참고
close()는 연결과 관련된 리소스를 해제하지만 연결을 즉시 닫지는 않을 수 있습니다. 적시에 연결을 종료하려면close()전에shutdown()을 호출하십시오.
- connect(address)¶
address 에 있는 원격 소켓에 연결합니다. address 의 형식은 주소 패밀리에 따라 다릅니다. — 소켓 패밀리 참조.
연결이 시그널에 의해 인터럽트되고, 시그널 처리기가 예외를 발생시키지 않으며, 소켓이 블로킹 모드이거나 시간제한(timeout)이 있는 경우 이 메서드는 연결이 완료될 때까지 대기하거나, 시간이 초과되면
TimeoutError를 발생시킵니다. 비차단(non-blocking) 소켓의 경우, 연결이 시그널에 의해 인터럽트되면 해당 메서드는InterruptedError예외(또는 시그널 처리기에 의해 발생한 예외)를 발생시킵니다.self,address를 인자로 감사 이벤트(auditing event)socket.connect를 발생시킵니다.버전 3.5에서 변경: 연결이 시그널에 의해 인터럽트 되고, 시그널 처리기가 예외를 발생시키지 않고, 소켓이 블로킹하거나 시간제한을 가지면, 이 메서드는 이제
InterruptedError예외를 발생시키는 대신 연결이 완료될 때까지 대기합니다 (이유는 PEP 475를 참조하십시오).가용성: not WASI.
- connect_ex(address)¶
connect(address)와 유사하지만, C 수준의connect()호출에 의해 반환된 오류에 대해 예외를 발생시키는 대신 에러 표시기를 반환합니다(호스트를 찾을 수 없는 경우 등 다른 문제는 여전히 예외를 발생시킬 수 있습니다). 성공하면 에러 표시값은0이고, 그렇지 않으면errno변수의 값이 됩니다. 이는 예를 들어 비동기 연결을 지원하는 데 유용합니다.self,address를 인자로 감사 이벤트(auditing event)socket.connect를 발생시킵니다.가용성: not WASI.
- detach()¶
하부 파일 기술자를 실제로 닫지 않으면서 소켓 객체를 닫힌 상태로 만듭니다. 파일 기술자가 반환되고, 다른 용도로 재사용 될 수 있습니다.
Added in version 3.2.
- fileno()¶
소켓의 파일 기술자(작은 정수)를 반환하거나, 실패하면 -1을 반환합니다. 이것은
select.select()에서 유용합니다.윈도우에서, 이 메서드가 돌려주는 작은 정수는 파일 기술자를 사용할 수 있는 곳(가령
os.fdopen())에 사용할 수 없습니다. 유닉스에는 이러한 제한이 없습니다.
- get_inheritable()¶
소켓의 파일 기술자나 소켓 핸들의 상속 가능 플래그를 가져옵니다: 소켓이 자식 프로세스에서 상속될 수 있으면
True, 그렇지 않으면False.Added in version 3.4.
- getpeername()¶
소켓이 연결된 원격 주소를 반환합니다. 이 값은 예를 들어 원격 IPv4/v6 소켓의 포트 번호를 확인하는 데 유용합니다. 반환되는 주소의 형식은 주소 패밀리에 따라 다릅니다. — 소켓 패밀리 참조. 일부 시스템에서는 지원되지 않을 수 있습니다.
- getsockname()¶
소켓 자신의 주소를 반환합니다. 이 값은 예를 들어 IPv4/v6 소켓의 포트 번호를 확인하는 데 유용합니다. 반환되는 주소의 형식은 주소 패밀리에 따라 다릅니다. — 소켓 패밀리 참조.
- getsockopt(level, optname[, buflen])¶
지정된 소켓 옵션의 값을 반환합니다(유닉스 매뉴얼 페이지 getsockopt(2) 참조). 필요한 심볼릭 상수는 이 모듈에 정의되어 있습니다(SO_* 등.). buflen 이 없으면 정수 옵션으로 간주하며 함수에서 그 정수 값을 반환합니다. bu1len 이 있으면 해당 옵션을 수신하는 데 사용되는 버퍼의 최대 길이를 지정하며, 이 버퍼는 bytes 객체로 반환됩니다. 버퍼 내용의 디코딩은 호출자의 책임입니다(바이트 문자열로 인코딩된 C 구조를 디코딩하는 방법은 선택적 내장 모듈인
struct를 참조하십시오).가용성: not WASI.
- getblocking()¶
소켓이 블로킹 모드면
True를 반환하고, 비 블로킹이면False를 반환합니다.이는
socket.gettimeout() != 0을 확인하는 것과 동일합니다.Added in version 3.7.
- gettimeout()¶
소켓 연산에 관련한 시간제한을 초(float)로 돌려줍니다. 시간제한이 설정되어 있지 않으면
None를 돌려줍니다. 이것은setblocking()이나settimeout()에 대한 마지막 호출을 반영합니다.
- ioctl(control, option)¶
ioctl()메서드는 WSAIoctl 시스템 인터페이스에 대한 제한된 인터페이스입니다. 자세한 내용은 Win32 설명서를 참조하십시오.다른 플랫폼에서는, 범용
fcntl.fcntl()과fcntl.ioctl()함수를 사용할 수 있습니다; 첫 번째 인자로 소켓 객체를 받아들입니다.현재 다음 제어 코드만 지원됩니다:
SIO_RCVALL,SIO_KEEPALIVE_VALS및SIO_LOOPBACK_FAST_PATH.가용성: Windows
버전 3.6에서 변경:
SIO_LOOPBACK_FAST_PATH가 추가되었습니다.
- listen([backlog])¶
서버가 연결을 수락하도록 합니다. backlog가 지정되면, 0 이상이어야 합니다 (더 낮으면 0으로 설정됩니다); 새로운 연결을 거부하기 전에 시스템이 허락할 수락되지 않은 연결 수를 지정합니다. 지정하지 않으면, 기본값으로 적당한 값이 선택됩니다.
가용성: not WASI.
버전 3.5에서 변경: 이제 backlog 매개 변수가 선택적입니다.
- makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)¶
Return a file object associated with the socket. The exact returned type depends on the arguments given to
makefile(). These arguments are interpreted the same way as by the built-inopen()function, except the only supported mode values are'r'(default),'w','b', or a combination of those.소켓은 블로킹 모드 여야 합니다; 시간제한을 가질 수 있지만, 시간 초과가 발생하면 파일 객체의 내부 버퍼가 일관성없는 상태로 끝날 수 있습니다.
makefile()에 의해 반환된 파일 객체를 닫는 것은, 다른 모든 파일 객체가 닫혔고 소켓 객체에서socket.close()가 호출되었지 않은 한 원래 소켓을 닫지는 않습니다.참고
윈도우에서,
makefile()로 만든 파일류 객체는 파일 기술자가 있는 파일 객체가 필요한 곳에서는 사용할 수 없습니다, 가령subprocess.Popen()의 stream 인자.
- recv(bufsize[, flags])¶
소켓에서 데이터를 수신합니다. 반환 값은 수신된 데이터를 나타내는 bytes 객체입니다. 한 번에 수신할 데이터의 최대 양은 bufsize 로 지정됩니다. 빈 bytes 객체가 반환되면 클라이언트가 연결을 끊었음을 의미합니다. 선택적 인자 flags 의 의미는 유닉스 매뉴얼 페이지 recv(2) 를 참조하십시오. 기본값은 0입니다.
버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제
InterruptedError예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).
- recvfrom(bufsize[, flags])¶
소켓에서 데이터를 수신합니다. 반환 값은
(bytes, address)쌍이며, 여기서 bytes 는 수신된 데이터를 나타내는 bytes 객체이고 address 는 데이터를 전송한 소켓의 주소입니다. 선택적 인자 flags 의 의미는 유닉스 매뉴얼 페이지 recv(2) 를 참조하십시오. 기본값은 0입니다. address 의 형식은 주소 패밀리에 따라 다릅니다. — 소켓 패밀리 참조.버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제
InterruptedError예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).버전 3.7에서 변경: 멀티캐스트 IPv6 주소의 경우, address의 첫 번째 항목에는
%scope_id부분이 더는 포함되지 않습니다. 전체 IPv6 주소를 얻으려면getnameinfo()를 사용하십시오.
- 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를 발생시키고, 관련 데이터의 시작 전에 절단되지 않은 버퍼 내에 있는 부분을 반환합니다.On systems which support the
SCM_RIGHTSmechanism, the following function will receive up to maxfds file descriptors, returning the message data and a list containing the descriptors (while ignoring unexpected conditions such as unrelated control messages being received). See alsosendmsg().import socket, array def recv_fds(sock, msglen, maxfds): fds = array.array("i") # 정수 배열 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: # 데이터 추가 시 끝부분의 잘린 정수는 무시. fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)
가용성: Unix.
대부분의 Unix 플랫폼.
Added in version 3.3.
버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제
InterruptedError예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).
- 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---')]
가용성: Unix.
대부분의 Unix 플랫폼.
Added in version 3.3.
- recvfrom_into(buffer[, nbytes[, flags]])¶
소켓에서 데이터를 수신하며, 새 바이트열을 생성하는 대신 buffer 에 씁니다. 반환 값은
(nbytes, address)쌍이며, 여기서 nbytes 는 수신된 바이트 수이고 address 는 데이터를 전송한 소켓의 주소입니다. 선택적 인자 flags 의 의미는 유닉스 매뉴얼 페이지 recv(2) 를 참조하십시오; 기본값은 0입니다. address 의 형식은 주소 패밀리에 따라 다릅니다. — 소켓 패밀리 참조.
- recv_into(buffer[, nbytes[, flags]])¶
소켓에서 최대 nbytes 바이트까지 수신하는데, 새 바이트열을 만드는 대신 데이터를 버퍼에 저장합니다. nbytes가 지정되지 않으면 (또는 0), 지정된 버퍼에서 사용 가능한 크기까지 수신합니다. 수신 한 바이트 수를 반환합니다. 선택적 인자 flags의 의미에 대해서는 유닉스 매뉴얼 페이지 recv(2)를 보십시오; 기본값은 0입니다.
- send(bytes[, flags])¶
소켓에 데이터를 전송합니다. 소켓은 원격 소켓에 연결되어 있어야 합니다. 선택적 flags 인자는
recv()와 동일한 의미를 가집니다. 전송된 바이트 수를 반환합니다. 모든 데이터가 전송되었는지 확인하는 것은 응용 프로그램의 책임입니다. 일부 데이터만 전송된 경우, 응용 프로그램은 나머지 데이터의 전달을 시도해야 합니다. 이 주제에 대한 자세한 정보는 소켓 프로그래밍 HOWTO 를 참조하십시오.버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제
InterruptedError예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).
- sendall(bytes[, flags])¶
소켓에 데이터를 전송합니다. 소켓은 원격 소켓에 연결되어 있어야 합니다. 선택적 flags 인자는
recv()와 동일한 의미를 가집니다.send()와 달리, 이 메서드는 모든 데이터가 전송되거나 오류가 발생할 때까지 bytes 로부터 데이터를 계속 전송합니다. 성공 시None이 반환됩니다. 오류 발생 시 예외가 발생하며, 성공적으로 전송된 데이터의 양을 확인하는 방법은 없습니다.버전 3.5에서 변경: 소켓 시간제한이 데이터를 전송할 때마다 매번 재설정되지 않습니다. 이제 소켓 시간제한은 모든 데이터를 보내는 데 필요한 최대 총 시간이 됩니다.
버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제
InterruptedError예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).
- sendto(bytes, address)¶
- sendto(bytes, flags, address)
소켓에 데이터를 전송합니다. 대상 소켓이 address 로 지정되므로, 소켓은 원격 소켓에 연결되어 있지 않아야 합니다. 선택적 flags 인자는
recv()와 동일한 의미를 가집니다. 전송된 바이트 수를 반환합니다. address 의 형식은 주소 패밀리에 따라 다릅니다. — 소켓 패밀리 참조.self,address를 인자로 감사 이벤트(auditing event)socket.sendto를 발생시킵니다.버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제
InterruptedError예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).
- 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))])
가용성: Unix, not WASI.
대부분의 Unix 플랫폼.
self,address를 인자로 감사 이벤트(auditing event)socket.sendmsg를 발생시킵니다.Added in version 3.3.
버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제
InterruptedError예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 PEP 475를 참조하십시오).
- sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])¶
AF_ALG소켓용,sendmsg()의 특수한 버전.AF_ALG소켓에 대한 모드, IV, AEAD 관련 데이터 길이 및 플래그를 설정합니다.가용성: Linux >= 2.6.38.
Added in version 3.6.
- sendfile(file, offset=0, count=None)¶
고성능
os.sendfile을 사용하여 EOF에 도달할 때까지 파일을 보내고, 보낸 총 바이트 수를 반환합니다. file은 바이너리 모드로 열린 일반 파일 객체여야 합니다.os.sendfile을 사용할 수 없거나 (예를 들어, 윈도우) file가 일반 파일이 아니면,send()가 대신 사용됩니다. offset은 파일 읽기 시작할 위치를 알려줍니다. 지정되면, count는 EOF에 도달할 때까지 파일을 전송하는 대신 전송할 총 바이트 수입니다. 파일 위치는 반환하거나 에러가 발생했을 때 갱신됩니다. 이때file.tell()을 사용하여 전송된 바이트 수를 계산할 수 있습니다. 소켓은SOCK_STREAM유형이어야 합니다. 비 블로킹 소켓은 지원되지 않습니다.Added in version 3.5.
- setblocking(flag)¶
소켓의 블로킹이나 비 블로킹 모드를 설정합니다. flag가 거짓이면, 소켓은 비 블로킹으로 설정되고, 그렇지 않으면 블로킹 모드로 설정됩니다.
이 메서드는 특정
settimeout()호출의 줄인 표현입니다:sock.setblocking(True)는sock.settimeout(None)와 동등합니다sock.setblocking(False)는sock.settimeout(0.0)와 동등합니다
버전 3.7에서 변경: 이 메서드는 더는
socket.type에SOCK_NONBLOCK플래그를 적용하지 않습니다.
- settimeout(value)¶
차단(blocking) 소켓 작업에 시간제한을 설정합니다. value 인자는 초 단위의 음이 아닌 실수 또는
None이 될 수 있습니다. 0이 아닌 값이 제공되면, 이후 소켓 작업은 완료되기 전에 지정된 value 기간이 경과할 경우timeout예외를 발생시킵니다. 0이 입력되면 소켓이 비차단 모드로 전환됩니다.None이 입력되면 소켓이 차단 모드로 전환됩니다.자세한 내용은, 소켓 시간제한에 대한 참고 사항을 보십시오.
버전 3.7에서 변경: 이 메서드는 더는
socket.type의SOCK_NONBLOCK플래그를 토글하지 않습니다.버전 3.15에서 변경: 정수나 실수뿐만 아니라 모든 실수를 수용합니다.
- setsockopt(level, optname, value: int | Buffer)¶
- setsockopt(level, optname, None, optlen: int)
지정된 소켓 옵션의 값을 설정합니다(유닉스 매뉴얼 페이지 setsockopt(2) 참조). 필요한 심볼릭 상수는 이 모듈에 정의되어 있습니다(SO_* 등. <socket-unix-constants>). 값은 정수,
None` 또는 버퍼를 나타내는 bytes-like object 가 될 수 있습니다. 후자의 경우 바이트열이 적절한 비트를 포함하고 있는지 확인하는 것은 호출자의 책임입니다(바이트스트링으로 C 구조를 인코딩하는 방법은 선택적 내장 모듈인struct를 참조하십시오). value 가None으로 설정되면 optlen 인수가 필요합니다. 이는 C 함수setsockopt()를optval=NULL및optlen=optlen과 함께 호출하는 것과 동일합니다.버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.
버전 3.6에서 변경: setsockopt(level, optname, None, optlen: int) 형식이 추가되었습니다.
가용성: not WASI.
- shutdown(how)¶
연결의 한쪽 또는 양쪽 절반을 닫습니다. how가
SHUT_RD면, 추가 수신이 허용되지 않습니다. how가SHUT_WR이면, 추가 전송이 허용되지 않습니다. how가SHUT_RDWR이면, 추가 송수신이 허용되지 않습니다.가용성: not WASI.
소켓을 복제하고 대상 프로세스와 공유할 수 있도록 준비합니다. 대상 프로세스는 process_id로 제공되어야 합니다. 결과 바이트열 객체는 어떤 프로세스 간 통신의 형태를 사용하여 대상 프로세스로 전달될 수 있으며 그곳에서
fromshare()를 사용하여 소켓을 다시 만들 수 있습니다. 일단, 이 메서드가 호출되면, 운영 체제가 이미 대상 프로세스를 위해 이를 복제 했으므로 소켓을 닫아도 안전합니다.가용성: Windows.
Added in version 3.3.
메서드
read()또는write()가 없으므로, 대신 flags 인자 없이recv()및send()를 사용하십시오.소켓 객체는 또한
socket생성자에 지정된 값에 대응하는 다음과 같은 (읽기 전용) 어트리뷰트를 가집니다.- family¶
소켓 패밀리.
- type¶
소켓 유형.
- proto¶
소켓 프로토콜.
소켓 시간제한에 대한 참고 사항¶
소켓 객체는 세 가지 모드 중 하나일 수 있습니다: 블로킹, 비 블로킹, 또는 시간제한. 소켓은 기본적으로 항상 블로킹 모드로 생성되지만, 이는 setdefaulttimeout()를 호출하여 변경할 수 있습니다.
블로킹 모드에서, 연산은 완료되거나 시스템에서 에러(가령 연결 시간 초과)를 반환할 때까지 블록합니다.
비차단(non-blocking) 모드 에서, 즉시 완료될 수 없는 작업은 (불행하게도 시스템에 따라 다른 오류와 함께) 실패하며, 이때
select모듈의 함수를 사용하여 소켓이 읽기 또는 쓰기에 가능한지 여부와 시점을 알 수 있습니다.시간제한 모드에서, 연산은 소켓에 대해 지정된 제한 시간 내에 완료할 수 없거나 (
timeout예외 발생), 시스템이 에러를 반환하면 실패합니다.
참고
운영체제 수준에서 타임아웃(timeout) 모드 의 소켓은 내부적으로 비차단 모드로 설정됩니다. 또한, 블로킹 및 타임아웃 모드는 동일한 네트워크 엔드포인트를 참조하는 파일 디스크립터와 소켓 객체 간에 공유됩니다. 이러한 구현 세부 사항은 예를 들어 소켓의 fileno() 를 사용하기로 결정할 경우 눈에 띄는 결과를 초래할 수 있습니다.
시간제한과 connect 메서드¶
connect() 연산도 시간제한 설정의 영향을 받으며, 일반적으로 connect()를 호출하기 전에 settimeout()를 호출하거나 create_connection()에 timeout 매개 변수를 전달하는 것이 좋습니다. 그러나, 시스템 네트워크 스택은 파이썬 소켓 시간제한 설정과 관계없이 자체의 연결 시간제한 에러를 반환할 수 있습니다.
시간제한과 accept 메서드¶
getdefaulttimeout()가 None이 아니면, accept() 메서드에서 반환된 소켓은 그 시간제한을 상속합니다. 그렇지 않으면, 동작은 리스닝 소켓의 설정에 따라 다릅니다:
예제¶
다음은 TCP/IP 프로토콜을 사용한 네 가지 최소 예제 프로그램입니다. 받은 모든 데이터를 다시 돌려주는 서버(단일 클라이언트만 처리)와 이를 사용하는 클라이언트가 포함됩니다. 서버는 socket(), bind(), listen(), accept() 순서로 실행되어야 하며, 여러 클라이언트를 처리하기 위해 accept() 를 반복할 수 있습니다. 반면 클라이언트는 socket(), connect() 순서만 필요합니다. 또한 서버는 대기 중인 소켓에 대해 직접 sendall()/recv() 를 수행하는 것이 아니라, accept() 에 의해 반환된 새 소켓에서 수행한다는 점에 유의하십시오.
처음 두 예제는 IPv4만 지원합니다.
# Echo 서버 프로그램
import socket
HOST = '' # 모든 사용 가능한 인터페이스를 의미하는 심볼릭 이름
PORT = 50007 # 임의의 비특권 포트
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 클라이언트 프로그램
import socket
HOST = 'daring.cwi.nl' # 원격 호스트
PORT = 50007 # 서버와 동일한 포트
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 서버 프로그램
import socket
import sys
HOST = None # 모든 사용 가능한 인터페이스를 의미하는 심볼릭 이름
PORT = 50007 # 임의의 비특권 포트
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 클라이언트 프로그램
import socket
import sys
HOST = 'daring.cwi.nl' # 원격 호스트
PORT = 50007 # 서버와 동일한 포트
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
# 공용 네트워크 인터페이스
HOST = socket.gethostbyname(socket.gethostname())
# Raw 소켓을 생성하고 공용 인터페이스에 바인드
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))
# IP 헤더 포함
s.setopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# 모든 패킷 수신
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# 패킷 수신
print(s.recvfrom(65565))
# 프로미스커스 모드 비활성화
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 프레임 패킹/언패킹 (linux/can.h의 'struct can_frame' 참조)
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])
# Raw 소켓을 생성하고 'vcan0' 인터페이스에 바인드
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를 참조하고 싶을 겁니다.