我在具有多个网络接口的主机之间使用多播UDP.我正在使用boost :: asio,并且被接收器必须进行的2个操作混淆:bind,然后是join-group.
当您对加入的每个组播组执行此操作时,为什么需要在绑定期间指定接口的本地地址?
姐妹问题是关于多播端口:因为在发送期间,您发送到多播地址和端口,为什么在订阅多播组期间,您只需指定地址,而不是端口 - 在混乱的呼叫中指定的端口绑定.
注意:"join-group"是一个包装器setsockopt(IP_ADD_MEMBERSHIP),如文档所示,可以在同一个套接字上多次调用以订阅不同的组(通过不同的网络?).因此,每次订阅组时,抛弃绑定调用并指定端口是完全合理的.
从我所看到的,总是绑定到"0.0.0.0"并在加入组时指定接口地址,效果非常好.困惑.
我正在创作一个java库.一些旨在由库用户使用的类保存本机系统资源(通过JNI).我想确保用户"处置"这些对象,因为它们很重,并且在测试套件中它们可能导致测试用例之间的泄漏(例如,我需要确保TearDown将丢弃).为此我使Java类实现了AutoCloseable,但这似乎不够,或者我没有正确使用它:
我不知道如何使用try-with-resources在测试的情况下(我使用的语句JUnit5有Mockito),在"资源"是不是短命的-这是测试夹具的一部分.
像往常一样勤奋,我尝试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.但是看起来,虽然已经注册,但是不会调用清理操作.我在这里问了一个跟进问题.
我有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
在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) 这更像是一个概念性问题.我正在尝试找到将两个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++ 17 std::unordered_map::extract函数,文档说:
提取节点仅使提取的元素的迭代器无效,并保留未擦除元素的相对顺序.指针和对提取的元素的引用仍然有效,但是当元素由节点句柄拥有时不能使用它们:如果元素被插入到容器中,它们就变得可用.
当然,extract使提取的迭代器无效(这是容器的一个东西,从中移除了元素).但是关于引用和指针的文档很时髦 - 它说它们仍然有效但在重新插入(可能是另一个)容器之前不能使用 - 它们将保留它们的值(?).
问题:我的用例是在提取后检查一个元素,即仅使用一个哈希查找执行erase-examine-discardForGood操作.该extract功能似乎非常适合这一点,但文档建议我不能node_type用来检查元素.我的理解是否正确?
我有以下测试代码:
#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) 为了测试某个功能, 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 链接内)?
另请参阅此问题,到目前为止尚未回答。
EPOLLHUP即使在man和内核文档中也有很多关于的困惑。人们似乎相信,当一个描述符轮询它返回本地关闭书写,即shutdown(SHUT_WR),即导致相同的呼叫EPOLLRDHUP 在对等。但这是不正确的,在我的实验中,我得到了EPOLLOUT,EPOLLHUP之后没有得到shutdown(SHUT_WR)(是的,变得可写是违反直觉的,因为写作的一半是封闭的,但这不是问题的重点)。
这个人很穷,因为它EPOLLHUP说到挂起发生在关联的文件描述符上时,而没有说“挂断”是什么意思-对方做了什么?发送了什么数据包?另一篇文章只是使事情更加混乱,对我来说似乎是完全错误的。
我的实验表明,EPOLLHUP一旦双向交换EOF(FIN数据包),即双方都发出,就到达了shutdown(SHUT_WR)。它与无关SHUT_RD,我从不称呼它。也与无关close。在数据包方面,我怀疑EPOLLHUP主机发送的FIN会引起确认,即终止发起方在4向关机握手的第3步中引发此事件,而对等方在第4步中引发(请参见此处))。如果得到确认,那就太好了,因为它填补了我一直在寻找的空白,即如何在不使用LINGER的情况下轮询非阻塞套接字以获得最终的确认。它是否正确?
(注意:我正在使用ET,但我认为与此无关)
该代码在一个框架之中,我提取它的肉,用之外TcpSocket::createListener,TcpSocket::connect和TcpSocket::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) #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>.有效的东西是将字符串文字扩展为字符:
const A& ar = {1, {'a', 'b'}}; // works
Run Code Online (Sandbox Code Playgroud)c++ ×5
bind ×2
gcc ×2
reference ×2
bash ×1
boost-asio ×1
c++11 ×1
c++17 ×1
comma ×1
cpu-word ×1
currying ×1
dialect ×1
dispose ×1
eclipse ×1
eclipse-cdt ×1
epoll ×1
epollet ×1
erase ×1
finalize ×1
header ×1
java ×1
linux ×1
linux-kernel ×1
multicast ×1
nullptr ×1
parameters ×1
sockets ×1
split ×1
tcp ×1
templates ×1
udp ×1