此问题与如何使用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初学者,因此欢迎使用任何示例/代码