【问题标题】:Networked logger for C using Multicast UDP?使用多播 UDP 的 C 网络记录器?
【发布时间】:2012-08-11 14:33:13
【问题描述】:

我可以从我的 Linux (C) 应用程序调用一个库,以便使用多播 UDP 向碰巧在网络上监听的任何人发送简单的日志消息,有什么推荐的吗?

【问题讨论】:

  • 您在搜索时发现了什么,例如谷歌?你试过这些吗?
  • 选项似乎是 log4cpp 或 syslog,似乎不太适合/太重。或者,我可以自己编写,但只有 QT 4.8 具有多播功能,而且我不想自己编写大量的套接字代码。
  • 系统日志不适合吗?您可以将日志交付与您的应用程序分离 - 您所做的只是调用 1 个函数 - 并配置 syslog 以在任何地方交付日志 - 例如多播目的地。

标签: c linux logging udp multicast


【解决方案1】:

当您问“任何库的推荐”时,我认为您不想要标准的 c 库,因为我从未见过有人问是否有人向 c 开发推荐 c 库。所以很明显你不需要比 c 库更多的东西,但我的回答完全符合你的问题,或者,也许问题不太好。

您可以使用优秀的 ZeroMQ 和 EPGM 协议(封装在 UDP 中)

zmq_pgm - ØMQ reliable multicast transport using PGM

在服务器端

void *context = zmq_init(1);
assert(context);
void *broadcast = zmq_socket(context, ZMQ_PUB);
assert(broadcast);
rc = zmq_bind(broadcast, "epgm://192.168.0.123:5555");
assert(rc==0);
rc = s_send(broadcast, "Hello world!");
assert(rc==0);

在客户端:

void *context = zmq_init(1);
assert(context);
void *watch = zmq_socket(context, ZMQ_SUB);
assert(watch);    
rc = zmq_connect(watch, "epgm://192.168.0.123:5555");
assert(rc==0);
char *message = s_receive(watch);
assert(message);

【讨论】:

  • 我相信他想使用任意 UDP 消息,而不是使用更高级别的包装器。
  • @Alnitak 您如何建议 OP 实现他的日志工具而不添加一些额外的信息?最简单的实现,数据包中的所有数据都是记录要写入文件/控制台的数据,总是可能的,但它提供的控制很少。
  • @HonkyTonk ZeroMQ 在这里描述并没有为内容提供任何结构,它只是将一些网络级别的优点(即多播处理和可靠传输)包装到 API 中。开发者仍然需要定义消息的内容。
【解决方案2】:

您不需要库来发送多播数据包。向多播套接字发送 UDP 消息仅比向单播地址发送消息稍微复杂一些。

特别是您需要使用setsockopt 来设置数据包的IP_MULTICAST_TTL

接收端稍微困难一些 - 您必须使用 setsockoptIP_ADD_MEMBERSHIP 加入特定的多播组才能接收发送给它的消息。

这些选项都记录在man 7 ip 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2011-09-16
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多