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)에 있는 주소는 처음에 널 바이트가 있는 바이트열류 객체로 반환됩니다; 이 이름 공간의 소켓은 일반 파일 시스템 소켓과 통신 할 수 있으므로, 리눅스에서 실행하려는 프로그램은 두 가지 유형의 주소를 모두 다뤄야 할 수도 있습니다. 문자열이나 바이트열류 객체는 인자로 전달할 때 두 가지 유형의 주소에 모두 사용할 수 있습니다.
쌍
(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.
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_VSOCK
¶ -
socket.
IOCTL_VM_SOCKETS_GET_LOCAL_CID
¶ -
VMADDR*
-
SO_VM*
리눅스 호스트/게스트 통신용 상수.
가용성 : 리눅스 >= 4.8.
버전 3.7에 추가.
-
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
orSOCK_CLOEXEC
bit flags are applied to type they are cleared, andsocket.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.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에 추가.
소켓 객체¶
소켓 객체에는 다음과 같은 메서드가 있습니다. makefile()
를 제외하고, 이것들은 소켓에 적용할 수 있는 유닉스 시스템 호출에 해당합니다.
-
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.
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는 새 파일 기술자를 네이티브 Cint
형의 바이너리 배열로 나타내는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.
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 modulestruct
for a way to encode C structures as bytestrings). When value is set toNone
, optlen argument is required. It’s equivalent to callsetsockopt()
C function withoptval=NULL
andoptlen=optlen
.버전 3.5에서 변경: 이제 쓰기 가능한 바이트열류 객체를 받아들입니다.
버전 3.6에서 변경: setsockopt(level, optname, None, optlen: int) 형식이 추가되었습니다.
-
socket.
shutdown
(how)¶ 연결의 한쪽 또는 양쪽 절반을 닫습니다. how가
SHUT_RD
면, 추가 수신이 허용되지 않습니다. how가SHUT_WR
이면, 추가 전송이 허용되지 않습니다. how가SHUT_RDWR
이면, 추가 송수신이 허용되지 않습니다.
소켓을 복제하고 대상 프로세스와 공유할 수 있도록 준비합니다. 대상 프로세스는 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()
메서드에서 반환된 소켓은 그 시간제한을 상속합니다. 그렇지 않으면, 동작은 리스닝 소켓의 설정에 따라 다릅니다:
예제¶
다음은 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를 참조하고 싶을 겁니다.