2012-09-21 5 views
0

파이썬에서 raw 소켓 프로그램을 구현하고 있는데, 내 소켓을 인터페이스에 바인딩 할 수있는 곳이 bind()입니다. 이 함수의 첫 번째 필드는 바인딩하려는 인터페이스입니다. 두 번째 필드 란 무엇입니까? Ethertype입니까 (예 : IP4)? 파이썬 참조 문서에있는 raw socket example의 코드는 다음과 같습니다파이썬에서 raw 소켓을위한 bind() 함수의 두 번째 필드

# 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)) 

왜 두 번째 필드 제로? 다른 examples에서는 이것이 자주 0x0800 (또는 10 진수 2048)로 설정되어이 소켓이 IP4 프로토콜로 소켓을 설정하고 있다고 생각합니다. 나는 또한 이것을 9999로 설정 한 것을 보았습니다. 아마 나는 여기에서 뭔가를 놓치거나 오해하고 있습니다.

답변

3

두 번째 필드는 바인딩 할 포트 번호를 나타냅니다. 그러나 0으로 설정하면 OS가 1024에서 65535 범위의 사용 가능한 포트를 선택할 수 있습니다.

그런 다음 sock.getsockname()[1]에서 선택한 포트를 가져올 수 있습니다.

또한 첫 번째 필드 (호스트)를 0.0.0.0 또는 ''으로 설정하면 모든 IPv4 주소에서 연결을 허용 할 수 있습니다.


편집 : @highlycaffeinated는 지적 socket.AF_INET 주소 패밀리가 선택되기 때문에, 위의 사실이다. 그러나 socket.AF_INET6이 선택되면 형식은 (host, port, flowinfo, scopeid)이됩니다.

+0

+1. 이것이 raw 소켓과 아무 관련이 없다는 것을 언급 할 필요가 있습니다. 스트림이나 데이터 그램 (TCP 또는 UDP, INET 제품군의 경우)과 똑같은 것이 사실입니다. – abarnert

+0

+1 이것은 나를 위해 물건을 지 웁니다. 감사! – chembrad

+0

@chembrad 기꺼이 도와 드리겠습니다. –

1

값은 사용중인 주소 패밀리에 따라 다릅니다. 당신처럼 쇼 AF_INET 들어, 그 포트 번호. 하나의 문자열이 AF_UNIX 주소 가족을 위해 을 사용하는 경우 : docs에서 다음과 같이

소켓 주소가 표시됩니다. AF_INET 주소 패밀리에 한 쌍 (호스트, 포트)이 사용됩니다. 여기서 host는 'daring.cwi.nl'과 같은 인터넷 도메인 표기의 호스트 이름 또는 '100.50.200.5'와 같은 IPv4 주소를 나타내는 문자열입니다. port는 정수입니다. AF_INET6 주소 패밀리를 들어, 네 개의 튜플 (호스트 포트 flowinfo, 경우 ScopeId)는 flowinfo 및 경우 ScopeId가 sin6_flowinfo 나타내고 소켓 모듈 방법에 대해서는 C.에서 구조체에서 sockaddr_in6에 부재 sin6_scope_id , flowinfo 및 경우 ScopeId 될 수 있으며, 사용 단지 이전 버전과의 호환성을 위해 생략되었습니다. 그러나 scopeid를 생략하면 범위의 IPv6 주소를 조작 할 때 문제가 발생할 수 있습니다. 다른 주소 집단은 현재 을 지원하지 않습니다.

+0

이것은 모두 정확하지만 포트 0의 특별한 의미를 설명하지는 않습니다. 이는 OP를 혼란스럽게 만들었습니다. – abarnert

관련 문제