It seems that bitcoin{d,-qt} can be crashed by being sent an inv of an unknown type. At least, it caused mine to:-

```
2016-11-08 00:45:36.470 ProcessMessages(getdata, 397 bytes): CHECKSUM ERROR expected=6d9dbcdf was=a1046737 peer=39585
2016-11-08 00:45:36.481 

************************
EXCEPTION: St12out_of_range       
CInv::GetCommand(): type=1373179482 unknown type       
bitcoin in ProcessMessages()       

2016-11-08 00:45:36.482 ProcessMessages(getdata, 397 bytes) FAILED peer=39585
2016-11-08 00:45:36.487 

************************
EXCEPTION: St12out_of_range       
CInv::GetCommand(): type=1373179482 unknown type       
bitcoin in msghand       

```

If the `throw std::out_of_range(strprintf("CInv::GetCommand(): type=%d unknown type", type));` in protocol.cpp supposed to cause the program to end?
{
    return (a.type < b.type || (a.type == b.type && a.hash < b.hash));
}
std::string CInv::GetCommand() const
{
    std::string cmd;
    if (type & MSG_WITNESS_FLAG)
        cmd.append("witness-");
    int masked = type & MSG_TYPE_MASK;
    switch (masked)
    {
    case MSG_TX:             return cmd.append(NetMsgType::TX);
    case MSG_BLOCK:          return cmd.append(NetMsgType::BLOCK);
    case MSG_FILTERED_BLOCK: return cmd.append(NetMsgType::MERKLEBLOCK);
    case MSG_CMPCT_BLOCK:    return cmd.append(NetMsgType::CMPCTBLOCK);
    default:
        throw std::out_of_range(strprintf("CInv::GetCommand(): type=%d unknown type", type));
    }
}
std::string CInv::ToString() const
{
    return strprintf("%s %s", GetCommand(), hash.ToString());
}
const std::vector<std::string> &getAllNetMessageTypes()
{
    return allNetMessageTypesVec;
}