Netlink库“输入的消息太短”

时间:2019-03-20 08:04:35

标签: haskell netlink

此问题与如何使用haskell netlink库有关。 我遇到问题的强制转换(?)机制可能是一个更通用的haskell问题,这就是为什么我希望可以在这里提问。

我以前在这里暴露了我的问题:https://github.com/Ongy/netlink-hs/issues/5,但这是摘要:

我正在尝试使用库netlink(也有https://github.com/Ongy/netlink-hs,在黑客环境下),通过netlink协议与内核模块进行通信。 我通过recvOne'呼叫(这里称为https://github.com/teto/netlink_pm/blob/v5/hs/daemon.hs#L502)接收数据包:

results <- (recvOne' simpleSock) :: IO [Either String MptcpPacket]

此处https://github.com/Ongy/netlink-hs/blob/master/System/Linux/Netlink.hs#L395定义为:

recvOne' :: (Convertable a, Eq a, Show a) => NetlinkSocket -> IO [Either String (Packet a)]
recvOne' sock = getPackets' <$> recvmsg sock bufferSize

但是在启动时,我的程序会立即用

停止
daemon.hs: user error (Too short input for last message =.=)

我的信念是,我的recvOne'调用会将所有内容投射到一个(大)MptcpPacket

type MptcpPacket = Packet GenlData NoDataMptcp

直接发送,而堆栈可以发送较小的数据包,例如ErrorMsg / DoneMsg https://github.com/Ongy/netlink-hs/blob/master/System/Linux/Netlink.hs#L115

data Packet a
        = Packet -- The "normal" message
    {
      packetHeader     :: Header -- ^The netlink message header
    , packetCustom     :: a -- ^The datatype for additional static data for the interface
    , packetAttributes :: Attributes -- ^The netlink attributes
    }
        | ErrorMsg -- The error message
    {
      packetHeader     :: Header -- ^The netlink message header
    , packetError      :: CInt -- ^The error ID for this error message
    , errorPacket      :: Packet a -- ^The offending message
    }
        | DoneMsg -- The done message, this should usually not be seen by a user
    {
      packetHeader     :: Header -- ^The header of the done message
    }
deriving (Eq)

我的问题因此变成:  -使用此库,我如何检索所有数据包,然后才可以区分ErrorMsg / DoneMsg和有效的netlink数据包。 Haskell强迫我投某物,但这很奇怪。我应该使用某种例外吗?我会这样丢包吗?等等。

由于我仍然是Haskell初学者,因此欢迎使用任何示例/代码

0 个答案:

没有答案