小编hae*_*lix的帖子

绑定多播(UDP)套接字是什么意思?

我在具有多个网络接口的主机之间使用多播UDP.我正在使用boost :: asio,并且被接收器必须进行的2个操作混淆:bind,然后是join-group.

当您对加入的每个组播组执行此操作时,为什么需要在绑定期间指定接口的本地地址?

姐妹问题是关于多播端口:因为在发送期间,您发送到多播地址和端口,为什么在订阅多播组期间,您只需指定地址,而不是端口 - 在混乱的呼叫中指定的端口绑定.

注意:"join-group"是一个包装器setsockopt(IP_ADD_MEMBERSHIP),如文档所示,可以在同一个套接字上多次调用以订阅不同的组(通过不同的网络?).因此,每次订阅组时,抛弃绑定调用并指定端口是完全合理的.

从我所看到的,总是绑定到"0.0.0.0"并在加入组时指定接口地址,效果非常好.困惑.

sockets udp bind multicast boost-asio

65
推荐指数
4
解决办法
10万
查看次数

在Java中,如何检查AutoCloseable.close()是否已被调用?

我正在创作一个java库.一些旨在由库用户使用的类保存本机系统资源(通过JNI).我想确保用户"处置"这些对象,因为它们很重,并且在测试套件中它们可能导致测试用例之间的泄漏(例如,我需要确保TearDown将丢弃).为此我使Java类实现了AutoCloseable,但这似乎不够,或者我没有正确使用它:

  1. 我不知道如何使用try-with-resources在测试的情况下(我使用的语句JUnit5Mockito),在"资源"是不是短命的-这是测试夹具的一部分.

  2. 像往常一样勤奋,我尝试finalize()在那里实现和测试闭包,但事实finalize()证明甚至没有调用(Java10).这也被标记为已弃用,我确信这个想法不会受到诟病.

这是怎么做到的?要清楚,如果他们不调用close()我的对象,我希望应用程序的测试(使用我的库)失败.


编辑:添加一些代码,如果它有帮助.它并不多,但这正是我想要做的.

@SuppressWarnings("deprecation") // finalize() provided just to assert closure (deprecated starting Java 9)
@Override
protected final void finalize() throws Throwable {
    if (nativeHandle_ != 0) {
         // TODO finalizer is never called, how to assert that close() gets called?
        throw new AssertionError("close() was not called; native object leaking");
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2,赏金的结果感谢所有的回复,一半的赏金被自动授予.我的结论是,对于我的情况,最好尝试解决方案Cleaner.但是看起来,虽然已经注册,但是不会调用清理操作.我在这里问了一个跟进问题.

java dispose finalize try-with-resources autocloseable

26
推荐指数
3
解决办法
1695
查看次数

Eclipse CDT没有在头文件更改上构建项目

我有Eclipse Platform 3.7.2和CDT 8.0.2.

当我想要从其他工作区项目执行"Build All"标头时,不会将其视为依赖项,也不会重建任何内容.

我有一个hello world应用程序和一个静态库项目.静态库在Project Properties中设置为引用 - > c/c ++ general - > Paths and SYmbols - > References选项卡 - >选中'Active'.这是我改变的唯一设置.

顺便说一句,它完全胜过我为什么Eclipse在Project Properties下有一个额外的"Project References"顶级项目.

无论如何,我尝试了外部构建器(在项目创建时默认选中)和内部构建器,还结合了全局设置'首选项 - > c ++ - >构建 - >构建配置的组合,只有当Eclipse资源发生变化时........"

感谢您对此的任何想法.

更新:这是构建依赖项目Proj2(Proj1是lib)时的控制台输出.'make all'被调用但它只是重新链接,它不会重新编译Main.cpp.有人熟悉eclipse生成的makefile吗?再次感谢.

**** Build of configuration Debug for project Proj2 ****

make all 
Building target: Proj2
Invoking: Cross G++ Linker
g++ -L"/home/user/.eclipse-workspace/Proj1/Debug" -o "Proj2"  ./Main.o   -lProj1
Finished building target: Proj2


**** Build Finished ****
Run Code Online (Sandbox Code Playgroud)

编辑:这已经有1.5年了,想补充说已经为此提交了一个Eclipse错误:https: //bugs.eclipse.org/bugs/show_bug.cgi?id = 375500

eclipse reference header eclipse-cdt

17
推荐指数
1
解决办法
6985
查看次数

将多字参数传递给bash函数

在bash脚本函数中,我需要使用脚本的命令行参数,以及另一个参数列表.所以我试图将两个参数列表传递给一个函数,问题是多字参数被拆分.

function params()
{
    for PARAM in $1; do
        echo "$PARAM"
    done

    echo .

    for ITEM in $2; do
        echo "$ITEM"
    done
}

PARAMS="$@"
ITEMS="x y 'z t'"
params "$PARAMS" "$ITEMS"
Run Code Online (Sandbox Code Playgroud)

调用脚本给了我

myscript.sh a b 'c d'
a
b
c
d
.
x
y
'z
t'
Run Code Online (Sandbox Code Playgroud)

由于有两个列表,它们必须作为一个整体传递给函数,问题是,如何在尊重单引号'cd'和'z t'中包含的多字项时迭代元素?

我有的解决方法(见下文)使用BASH_ARGV,所以我只需要将一个列表传递给该函数.但是,我想更好地了解正在进行的工作以及完成上述工作所需的工作.

function params()
{
    for PARAM in "${BASH_ARGV[@]}"; do
        echo "$PARAM"
    done

    echo .

    for ITEM in "$@"; do
        echo "$ITEM"
    done
}

params x y 'z t'
Run Code Online (Sandbox Code Playgroud)

调用脚本给了我

myscript.sh a b …
Run Code Online (Sandbox Code Playgroud)

parameters bash split cpu-word

14
推荐指数
1
解决办法
2万
查看次数

在C++元编程中为模板进行Currying

这更像是一个概念性问题.我正在尝试找到将两个arg模板(参数类型)转换为一个arg模板的最简单方法.即,绑定其中一种类型.

这将是bindboost/std中的元编程等价物.我的例子包括一个可能的用例,即std::is_same作为模板参数传递给一个模板,该模板采用一个arg模板模板参数(std::is_same是一个双arg模板),即TypeList::FindIf.在TypeList没有完全在这里实现,也不是FindIf,但你的想法.它采用"一元谓词"并返回该谓词为真的void类型,如果不是这样的类型.

我有两个工作变体,但第一个不是单行,第二个使用相当冗长的BindFirst装置,这对非类型模板参数不起作用.有没有一种简单的方法来编写这样的单行程?我相信我正在寻找的程序被称为currying.

#include <iostream>

template<template<typename, typename> class Function, typename FirstArg>
struct BindFirst
{
    template<typename SecondArg>
    using Result = Function<FirstArg, SecondArg>;
};

//template<typename Type> using IsInt = BindFirst<_EqualTypes, int>::Result<Type>;
template<typename Type> using IsInt = std::is_same<int, Type>;


struct TypeList
{
    template<template<typename> class Predicate>
    struct FindIf
    {
        // this needs to be implemented, return void for now
        typedef void Result;
    };
};

int main() …
Run Code Online (Sandbox Code Playgroud)

c++ templates bind metaprogramming currying

11
推荐指数
1
解决办法
1359
查看次数

std :: unordered_map :: extract references/pointers invalidation

对于新的C++ 17 std::unordered_map::extract函数,文档说:

提取节点仅使提取的元素的迭代器无效,并保留未擦除元素的相对顺序.指针和对提取的元素的引用仍然有效,但是当元素由节点句柄拥有时不能使用它们:如果元素被插入到容器中,它们就变得可用.

当然,extract使提取的迭代器无效(这是容器的一个东西,从中移除了元素).但是关于引用和指针的文档很时髦 - 它说它们仍然有效但在重新插入(可能是另一个)容器之前不能使用 - 它们将保留它们的值(?).

问题:我的用例是在提取后检查一个元素,即仅使用一个哈希查找执行erase-examine-discardForGood操作.该extract功能似乎非常适合这一点,但文档建议我不能node_type用来检查元素.我的理解是否正确?

c++ unordered-map erase c++17

8
推荐指数
2
解决办法
505
查看次数

逗号运算符,return语句和nullptr没有副作用?

我有以下测试代码:

#include <cstdint>
#include <cassert>

enum class Result : std::uint32_t {SUCCESS = 0, INSUCCESS = 1};

void* func(Result& result)
{
    // works great
    /*
    result = Result::INSUCCESS;
    return NULL;
    */

    // error: invalid conversion from ‘long int’ to ‘void*’ [-fpermissive]
    /*
    return result = Result::INSUCCESS, NULL;
    */

    // compiles, but <result> is not set???
    return result = Result::INSUCCESS, nullptr;
}

void testReturnWithSideEffects()
{
    Result result = Result::SUCCESS;
    func(result);
    assert(result == Result::INSUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

这里有两个问题但我对第二个问题最感兴趣:

为什么没有设置结果?

编辑:感谢大家的确认.我决定使用的解决方法是替换:

return result = Result::INSUCCESS, nullptr; …
Run Code Online (Sandbox Code Playgroud)

c++ gcc comma nullptr c++11

7
推荐指数
1
解决办法
556
查看次数

C++“功能测试宏”的值是什么意思?

为了测试某个功能, cppreference 提到了这些功能测试宏: link

如果编译器中存在该功能,则定义宏。但我不明白为什么,如果定义了,它们会被定义为类似的东西201606,我相信这是C++ 的版本,而不是编译器的版本

例如,我正在使用 GCC 的最新版本来实现-std=c++17该功能__cpp_lib_hardware_interference_size。该宏未定义,我认为这意味着 GCC 没有该功能,尽管尝试使用 c++17(和 c++2a)开关 8.2.1。在这种情况下,记录值的意义是什么:

__cpp_lib_hardware_interference_size 201703

(在 cppreference 链接内)?

c++ gcc compiler-flags dialect

7
推荐指数
1
解决办法
2192
查看次数

TCP:何时生成EPOLLHUP?

另请参阅此问题,到目前为止尚未回答。

EPOLLHUP即使在man和内核文档中也有很多关于的困惑。人们似乎相信,当一个描述符轮询它返回本地关闭书写,即shutdown(SHUT_WR),即导致相同的呼叫EPOLLRDHUP 在对等。但这是不正确的,在我的实验中,我得到了EPOLLOUTEPOLLHUP之后没有得到shutdown(SHUT_WR)(是的,变得可写是违反直觉的,因为写作的一半是封闭的,但这不是问题的重点)。

这个很穷,因为它EPOLLHUP说到挂起发生在关联的文件描述符上时,而没有说“挂断”是什么意思-对方做了什么?发送了什么数据包?另一篇文章只是使事情更加混乱,对我来说似乎是完全错误的。

我的实验表明,EPOLLHUP一旦双向交换EOF(FIN数据包),即双方都发出,就到达了shutdown(SHUT_WR)。它与无关SHUT_RD,我从不称呼它。也与无关close。在数据包方面,我怀疑EPOLLHUP主机发送的FIN会引起确认,即终止发起方在4向关机握手的第3步中引发此事件,而对等方在第4步中引发(请参见此处))。如果得到确认,那就太好了,因为它填补了我一直在寻找的空白,即如何在不使用LINGER的情况下轮询非阻塞套接字以获得最终的确认。它是否正确?

(注意:我正在使用ET,但我认为与此无关)

示例代码和输出。

该代码在一个框架之中,我提取它的肉,用之外TcpSocket::createListenerTcpSocket::connectTcpSocket::accept,它做你所期望(这里没有显示)。

void registerFd(int pollFd, int fd, const char* description)
{
    epoll_event ev = {
        EPOLLIN | EPOLLOUT | EPOLLRDHUP | EPOLLET,
        const_cast<char*>(description) // union aggregate initialisation, initialises …
Run Code Online (Sandbox Code Playgroud)

linux epoll tcp linux-kernel epollet

6
推荐指数
1
解决办法
1143
查看次数

为什么这不起作用?(括号初始化引用)

#include <array>

int main()
{
    struct A
    {
        unsigned char l;
        std::array<char, 12> c;
    };

    const A a = {1, "t"}; // OK
    const A& ar = {1, "t"}; // error: invalid initialization of reference of type 'const main()::A&' from expression of type '<brace-enclosed initializer list>'
}
Run Code Online (Sandbox Code Playgroud)

(gcc 8.2,-std = c ++ 17)

这个问题谈到了一个海湾合作委员会的错误,但它已经过时了(7年前).

请注意,我不关心生命周期扩展,我实际上是将临时文件直接传递给函数而不是存储它,但我尝试将示例清理干净.


编辑:

  • 我不能让这个例子变小.特别是,它与...有关array<char>.
  • 在"t"周围添加更多大括号但仍然失败.
  • 有效的东西是将字符串文字扩展为字符:

    const A& ar = {1, {'a', 'b'}}; // works
    
    Run Code Online (Sandbox Code Playgroud)

c++ reference list-initialization

6
推荐指数
1
解决办法
185
查看次数