加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Haskell中的原始套接字

发布时间:2020-12-15 21:51:17 所属栏目:安全 来源:网络整理
导读:Network.Socket中提供了一个原始套接字类型,但是在近端绑定套接字上有一条注释“目前只支持Unix域套接字并支持Internet系列”.我怎样才能在 haskell中使用原始套接字? 我正在尝试实现的功能,如使用Python代码: import binasciiimport socket# Create raw s
Network.Socket中提供了一个原始套接字类型,但是在近端绑定套接字上有一条注释“目前只支持Unix域套接字并支持Internet系列”.我怎样才能在 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 "NULNULNULNULNULNULNULNULNULNULNULNUL255255"
*** Exception: send: does not exist (No such device or address)

这是有道理的,因为内核对于实际传输数据包的接口没有任何线索.有没有办法将(原始)套接字绑定到Haskell中的接口?

解决方法

Network.Pcap可用于发送和接收原始数据.

import qualified Data.ByteString.Char8 as B
import Network.Pcap

main = do
    -- open device
    dev <- openLive "lo" 65535 False 0
    setFilter dev "ether proto 0xFFFF" True 0

    -- send
    sendPacketBS dev (B.pack "NULNULNULNULNULNULNULNULNULNULNULNUL255255Hello,World!")

    -- receive
    loopBS dev (-1) (_ packet -> putStrLn (show packet))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读