Network.Socket에는 원시 소켓 유형이 있지만 바인딩 소켓 근처에는 "현재 Unix 도메인 소켓과 인터넷 제품군 만 지원됩니다."라는 주석이 있습니다. 어떻게하면 haskell에서 원시 소켓을 사용할 수 있습니까?하스켈의 원시 소켓
import binascii
import socket
# Create raw socket.
ethType = b'FFFF' # 2 bytes, has to be >= 0x0600. FFFF is "unavailable" by IEEE.
sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
sock.bind(('lo', int(ethType,16)))
# Create packet.
srcMac = b'000000000000' # 6 bytes
destMac = b'000000000000' # 6 bytes
header = binascii.a2b_hex(destMac + srcMac + ethType) # 14 bytes
message = b'Hello, World!'
sock.send(header + message)
# Receive such packets
while True: print (sock.recv(65535))
는 EDIT1 :
내가 작업 파이썬 코드로, 달성하기 위해 노력하고 무엇하스켈에서 , 내가 소켓을 만들 수 sock <- socket AF_PACKET Raw 0xFFFF
를 사용하지만 bindSocket
는 인수로 SockAddr
을 필요로 사용할 수있는 생성자에 대한
SockAddrInet PortNumber HostAddress
SockAddrInet6 PortNumber FlowInfo HostAddress6 ScopeID
SockAddrUnix String
그러나이 중 어느 것도 옳지 않은 것으로 보입니다.
EDIT2 : 내가 패킷을 수신있어 Yuras에 의해 코멘트에 덕분에 작동하도록 :
import Network.Socket
sock <- socket AF_PACKET Raw 0xFFFF
recv sock 0xFFFF
EDIT3 : 에 예외 결과 바인딩하지 않고 소켓에서 패킷을 보내려고 :
sock <- socket AF_PACKET Raw 0xFFFF
send sock "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\255\255"
*** Exception: send: does not exist (No such device or address)
커널은 실제로 패킷을 전송할 인터페이스에 대한 단서가 없으므로 의미가 있습니다. 하스켈에서 (원시) 소켓을 인터페이스에 바인딩하는 방법이 있습니까?
... 무엇이 문제입니까? –
['AF_PACKET'] (http://hackage.haskell.org/packages/archive/network/2.3.0.11/doc/html/src/Network-Socket-Internal.html#Family)'가 지원되며 [ 'SOCK_RAW'] (http://hackage.haskell.org/packages/archive/network/2.3.0.11/doc/html/src/Network-Socket.html#SocketType). 나와 똑같은 번역본처럼 보입니다. –
하스 켈에서 이것을하는 방법? – Andres