«Слишком короткий ввод для последнего сообщения» с библиотекой netlink - PullRequest
0 голосов
/ 20 марта 2019

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

...