Hay un tipo de zócalo sin formato en Network.Socket, pero cerca de los zócalos de enlace hay un comentario "Actualmente solo son compatibles los zócalos de dominio Unix y las familias de Internet". ¿Cómo puedo usar enchufes sin procesar en haskell?Enchufes sin procesar en Haskell
Lo que estoy tratando de lograr, como el trabajo código Python:
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: En Haskell, utilizo sock <- socket AF_PACKET Raw 0xFFFF
para crear un socket, pero bindSocket
requiere un SockAddr
como argumento, para lo cual dispone de constructores son
SockAddrInet PortNumber HostAddress
SockAddrInet6 PortNumber FlowInfo HostAddress6 ScopeID
SockAddrUnix String
pero ninguno de estos parece correcto.
Edit2: Gracias a un comentario de Yuras me reciben paquetes a trabajar:
import Network.Socket
sock <- socket AF_PACKET Raw 0xFFFF
recv sock 0xFFFF
Edit3: intentar enviar un paquete desde un enchufe sin atar el resultado es una excepción:
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)
Esto tiene sentido, porque el kernel no tendría ninguna pista sobre qué interfaz transmitir realmente el paquete. ¿Hay alguna manera de vincular un socket (sin formato) a una interfaz en Haskell?
... ¿cuál es su pregunta? –
['AF_PACKET'] (http://hackage.haskell.org/packages/archive/network/2.3.0.11/doc/html/src/Network-Socket-Internal.html#Family)' es compatible, como es [ 'SOCK_RAW'] (http://hackage.haskell.org/packages/archive/network/2.3.0.11/doc/html/src/Network-Socket.html#SocketType). Parece una traducción directa para mí. –
¿Cómo hacer esto en Haskell? – Andres