Network.Socket中提供了一個原始套接字類型,但在接近綁定套接字處有一條註釋「目前只支持Unix域套接字和Internet系列」。我如何在Haskell中使用原始套接字?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
但這些似乎都沒有。
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)
這很有意義,因爲內核不會在實際傳輸數據包的接口上有任何線索。有沒有辦法將(原始)套接字綁定到Haskell中的接口?
...你的問題是什麼? – 2012-04-19 13:45:00
['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)。看起來像一個簡單的向前翻譯給我。 – 2012-04-19 13:49:20
如何在Haskell中做到這一點? – Andres 2012-04-19 13:49:25