在一个小型网络中,比如20个节点或更少,我的程序在测试仪器上需要知道"谁在那里?" 由MAC而不是IP.我将插入随机网络,并且需要能够在不必知道网络中的任何地址,MAC或其他情况的情况下执行此操作,并且知道我不能依赖DHCP.DHCP服务器可能关闭并且节点没有IP地址和/或我无法获得一个是完全合理的.说实话,我不需要IP,我们的测试协议是MAC层,而不是IP.
那么,我如何确定我的乐器的邻居的MAC地址?这听起来很像LLDP但是倒退,即"谁在那里",而不是"我在这里,我可以做到这一点......".我必须假设没有IP分配给端点,所以没有ARPing,没有NMAP等.
注意我应该补充一点,这是一个有线网络.
我已经读过墙上的文字,避免全球.这导致了一个明显的问题,如何最好地做到这一点?
我显然想用当前的项目来做.目标是让远程PC向已经拥有stdin阅读器的应用程序发送"击键".我们的想法是让现有的代码检测到没有待处理的按键,然后检查是否有"udp按键",如果是,则将其填入所以它似乎是键盘输入.微创,不需要在其他人的代码中改装.
所以我拼凑了一个使用小UDP套接字读写setup()
函数打开并绑定端口,那么service()
在使用非阻塞循环功能select()
一次,没有循环,只是检查是否有任何阅读现在.如果是这样,请从套接字读取数据并对其执行某些操作,否则返回0.
// pseudo c
char c;
setup();
while (1)
{
c = check_for_keyboard_entry();
if ( c == 0 )
c = service();
handle_keypress( c );
do_a_bunch_of_other_stuff();
}
Run Code Online (Sandbox Code Playgroud)
显而易见的方法是使用一些全局变量来传输两个函数之间的端口,超时,sockaddr等.但是,你应该使用全局,对吗?
那么在函数之间传递六个或八个变量的首选方法是什么?
如果我要使用静态变量setup()
,它们是否可以通过service()
例程访问?
我想一个获得malloc-ed并传递的结构会起作用.我应该有一个cleanup()
关闭套接字并释放内存.
记住,这是AC问题.没有C++!
使用Google的日志记录库(glog-0.3.2),发送到由互斥锁包装的日志的各个条目是什么?也就是说,其他条目是否可以破坏当前正在保存的条目?
我想这转化为:是glog线程安全吗?
如果记录器设置为回显到控制台以及文件,没有我自己的互斥锁,有没有办法阻止printf
/ cout
破坏输出LOG()
?我怀疑不是,但想知道是否有办法锁定可以包装多个语句的互斥锁.
我已经看到了一些使用qDebug的Qt代码,就像它一样 printf()
qDebug( format, ... );
Run Code Online (Sandbox Code Playgroud)
大多数情况下,我看到它使用像 std::cout
qDebug() << "one " << var_one;
Run Code Online (Sandbox Code Playgroud)
用法有什么不同,何时使用另一个是正确/更好的?Qt帮助在线以某种方式似乎参考功能版本但从未解释它.
是否有一种C/C++方法使用read()从套接字读取数据并使接收缓冲区是文件(ofstream)或类似的自扩展对象(例如)?
编辑: 当我考虑如何读取可能接收10000+字节文件的内容的流套接字时出现了问题.我从来没有像把20000或50000字节(现在足够大)放在堆栈上作为缓冲区,文件可以临时存储,直到我可以插入文件.为什么不直接将其直接流入文件中以加注星标.
就像你可以在std:string里面的char*那样,我想到了类似的东西
read( int fd, outFile.front(), std::npos ); // npos = INT_MAX
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
结束编辑
谢谢.
我正在尝试使用clock_gettime(CLOCK_MONOTONIC,ts)。我包含了time.h,并链接到librt(我认为)。我仍然收到未定义CLOCK_MONOTONIC的错误。(编辑:添加了错误文本)
Symbol 'CLOCK_MONOTONIC' could not be resolved ... Semantic Error
Run Code Online (Sandbox Code Playgroud)
Eclipse中的C ++。在myrojname-> properties-> C / C ++ Build-> GCC C ++ Linker->库中,我添加了“ rt”。结果命令行包括-lrt。
我尝试了一个简单得多的草稿程序,并使用g ++ -o mytest mytest.cpp -lrt从命令行进行了编译,并且效果很好。
那么,我想念什么?
我是一名C++(MSVC)作家,VB新手试图协助一位刚刚未完成此任务的专家VB.net作家.
我们希望开发C/C++和VB应用程序,以使用C++编写的带有C外部API函数的DLL.C++程序运行得很好.这是我们遇到困难的VB.
DLL提供了一个extern C
功能:
RegisterCallback( void* cbFuncPtr, void* dataPtr );
Run Code Online (Sandbox Code Playgroud)
注1:请参阅下面的注释,了解设计变更以及我们制作的原因.
注2:附加更新作为下面的答案添加.
回调函数有哪个C typedef:
typedef (void)(* CALL_NACK)(void*);
Run Code Online (Sandbox Code Playgroud)
该cbFuncPtr
预期是一个函数指针,一些VB函数将被调用为CALL_BACK.它dataPtr
是指向具有此C定义的数据结构的指针:
typedef struct
{
int retCode;
void* a_C_ptr;
char message[500];
} cbResponse_t;
Run Code Online (Sandbox Code Playgroud)
其中a_C_ptr is an internal pointer in the DLL that the VB can cast to
long`.它唯一地标识DLL中回调的位置,并允许VB函数识别来自相同/不同位置的调用.
我们能够RegisterCallback()
很好地从VB 访问和运行该函数.记录显示我们到达那里并且数据被传入.实际数据似乎是问题所在.
在阅读大约一百万个论坛条目时,我们了解到VB不知道什么是指针,VB结构不仅仅是有组织的内存.我们非常确定VB结构的"地址"不是C认为的地址.我们已经多次提到"编组"和"托管数据",但缺乏足够的理解来了解这些信息.
我们应该如何编写VB来为DLL提供其回调函数的执行地址?我们如何编写DLL可以填充的VB结构,就像它对C++一样?
我们可能需要一个DLL函数,其中调用应用程序可以说"C"或"VB"并且DLL处理结构指针的方式不同吗?如果是这样,如何编写C来填充VB结构?
我想让g ++/gcc告诉我非系统的所有路径#include in C++ build.事实证明,这是一个艰难的搜索,因为谷歌通过十种不同的方式解释它.
我想要这些文件名和路径,以便我可以将它们添加到Exuberant CTAGS的搜索路径中.我们有一个庞大的项目,如果我在整个事情上使用ctags,生成标签文件大约需要半个小时,编辑器查找的时间也差不多.
我们使用CMakeLisats进行编译.如果有一个指令我可以粘贴到CMakeLists.txt,这将是额外的精彩.
我真的不需要默认路径和文件名,Johnathan Wakely 在这里提供了一个很好的工具.我认为这几乎涵盖了这是一个交叉编译工作的事实.我也不需要跨系统文件.
如何在我的(小型)本地网络上使用C或C++ PROGRAM(无命令行)来获取MAC地址(如果它们"免费",我也将获取IP地址).它是一个嵌入式Busybox Linux,所以我需要一个极简主义的答案,希望不需要移植一些库.我没有libnet或libpcap.如果DHCP主机,arp缓存似乎永远不会包含MAC.
我的谷歌技能让我失望.我认为这将是一个古老而磨损的问题.
在VIM输入模式下,如何<c-v>
识别我是否处于正常模式,即进入视觉块状模式?
我试了一下noremap! <C-v <ESC>:visual block
,但这显然不是一套合适的魔术词.
注意:根据@ Explosion的评论建议将"编辑模式"更改为"插入模式".