Libartnet错误-发送至失败:参数无效

问题描述 投票:0回答:1

我正在使用libartnet库(https://github.com/OpenLightingProject/libartnet/tree/master/artnet)来构建artnet DMX控制器。但是,当库尝试发送第一个数据包时,出现“错误:发送失败:无效参数”。

我在这里初始化库:

- (BOOL)initArtNet
{
   printf("Init art net\n");
   char *ip_addr = NULL;//"10.0.0.1";// NULL;//"10.0.0.75";//NULL;

   uint8_t subnet_addr = 0;
   uint8_t port_addr = 1;

   /*artnet_node **/m_artnetNode = artnet_new(ip_addr, 0);

   if (!m_artnetNode) {
       printf("Error: %s\n", artnet_strerror());
       return NO;
   }

   artnet_set_long_name(m_artnetNode, "Art-Net Test");
   artnet_set_short_name(m_artnetNode, "ANT");

   // set the upper 4 bits of the universe address
   artnet_set_subnet_addr(m_artnetNode, subnet_addr) ;

   // enable port 0
   artnet_set_port_type(m_artnetNode, 0, ARTNET_ENABLE_OUTPUT, ARTNET_PORT_DMX) ;

   // bind port 0 to universe 1
   artnet_set_port_addr(m_artnetNode, 0, ARTNET_OUTPUT_PORT, port_addr);

   artnet_dump_config(m_artnetNode);

   artnet_set_handler(m_artnetNode, ARTNET_RECV_HANDLER, artnetReceiver, NULL);

   if (artnet_start(m_artnetNode) != 0) {
       printf("Error: %s\n", artnet_strerror());
       return NO;
   }

   return YES;
}

artnet_start(m_artnetNode)在libartnet库中调用此方法:

int artnet_start(artnet_node vn) {
  node n = (node) vn;
  int ret;
  check_nullnode(vn);

  if (n->state.mode != ARTNET_STANDBY)

    return ARTNET_ESTATE;

  if ((ret = artnet_net_start(n)))
    return ret;

  n->state.mode = ARTNET_ON;

  if (n->state.reply_addr.s_addr == 0) {
    n->state.reply_addr = n->state.bcast_addr;
  }

  // build the initial reply
  if ((ret = artnet_tx_build_art_poll_reply(n)))
    return ret;

  if (n->state.node_type == ARTNET_SRV) {
    // poll the network
    if ((ret = artnet_tx_poll(n,NULL, ARTNET_TTM_AUTO)))
      return ret;

    if ((ret = artnet_tx_tod_request(n)))
      return ret;
  } else {
    // send a reply on startup
    if ((ret = artnet_tx_poll_reply(n, FALSE)))
      return ret;
  }
  return ret;
}

然后将错误引发到'artnet_tx_poll(n,NULL,ARTNET_TTM_AUTO)':

int artnet_tx_poll(node n, const char *ip, artnet_ttm_value_t ttm) {
  artnet_packet_t p;
  int ret;

  if (n->state.mode != ARTNET_ON)
    return ARTNET_EACTION;

  if (n->state.node_type == ARTNET_SRV || n->state.node_type == ARTNET_RAW) {
    if (ip) {
      ret = artnet_net_inet_aton(ip, &p.to);
      if (ret)
        return ret;
    } else {
      p.to.s_addr = n->state.bcast_addr.s_addr;
    }

    memcpy(&p.data.ap.id, ARTNET_STRING, ARTNET_STRING_SIZE);
    p.data.ap.opCode = htols(ARTNET_POLL);
    p.data.ap.verH = 0;
    p.data.ap.ver = ARTNET_VERSION;
    p.data.ap.ttm = ~ttm;
    p.data.ap.pad = 0;

    p.length = sizeof(artnet_poll_t);
    return artnet_net_send(n, &p);

  } else {
    artnet_error("Not sending poll, not a server or raw device");
    return ARTNET_EACTION;
  }
}

...在'sendto(...)'处调用'artnet_net_send(n,&p)':

int artnet_net_send(node n, artnet_packet p) {
  struct sockaddr_in addr;
  int ret;

  if (n->state.mode != ARTNET_ON)
    return ARTNET_EACTION;

  addr.sin_family = AF_INET;
  addr.sin_port = htons(ARTNET_PORT);
  addr.sin_addr = p->to;
  p->from = n->state.ip_addr;

  if (n->state.verbose)
    printf("sending to %s\n" , inet_ntoa(addr.sin_addr));

  ret = sendto(n->sd,
               (char*) &p->data, // char* required for win32
               p->length,
               0,
               (SA*) &addr,
               sizeof(addr));
  if (ret == -1) {
    artnet_error("Sendto failed: %s", artnet_net_last_error());
    n->state.report_code = ARTNET_RCUDPFAIL;
    return ARTNET_ENET;

  } else if (p->length != ret) {
    artnet_error("failed to send full datagram");
    n->state.report_code = ARTNET_RCSOCKETWR1;
    return ARTNET_ENET;
  }

  if (n->callbacks.send.fh) {
    get_type(p);
    n->callbacks.send.fh(n, p, n->callbacks.send.data);
  }
  return ARTNET_EOK;
}

我对此感到茫然,我看不到问题在libartnet库本身中,更多的是如何初始化或在我的xCode项目中设置的。无论哪种方式,我都将非常感激对此提供的任何帮助。

c++ c objective-c xcode
1个回答
0
投票

该项目正在通过单元测试运行,导致线程问题初始化artnet库。

© www.soinside.com 2019 - 2024. All rights reserved.