Необработанные сокеты в Haskell

В Network.Socket есть необработанный тип сокета, но рядом с привязкой сокетов есть комментарий «В настоящее время поддерживаются только сокеты домена Unix и семейства Интернет». Как я могу использовать необработанные сокеты в haskell?

Чего я пытаюсь достичь в виде рабочего кода 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:В Haskell я использую sock <- socket AF_PACKET Raw 0xFFFFдля создания сокета, но bindSocketтребует SockAddrв качестве аргумента, для которого доступны конструкторы

SockAddrInet PortNumber HostAddress  
SockAddrInet6 PortNumber FlowInfo HostAddress6 ScopeID   
SockAddrUnix String

, но ни один из них не кажется правильным.

РЕДАКТИРОВАТЬ2:Благодаря комментарию Юраса у меня заработал прием пакетов:

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)

. Это имеет смысл, поскольку ядро ​​не будет знать, через какой интерфейс фактически передавать пакет. Есть ли способ привязать сокет (raw)к интерфейсу в Haskell?

5
задан Andres 19 April 2012 в 18:00
поделиться