Эта проблема о том, как использовать библиотеку 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, любой пример / код приветствуется