コード例 #1
0
int
main(int argc, const char **argv)
{
  int i;

  // A service discovery object
  player_sd_t* sd;

  // Initialize multiclient
  mclient = playerc_mclient_create();

  // Initialize service discovery
  sd = player_sd_init();

  // Look for Player devices
  if(player_sd_browse(sd, 0.0, 1, browse_cb) != 0)
  {
    puts("player_sd_browse error");
    exit(-1);
  }

  for(;;)
  {
    // Update name service
    player_sd_update(sd,0.0);

    // Wait for new data from server
    playerc_mclient_read(mclient,10);
  }

  // Shutdown
  for(i=0;i<num_laserdevs;i++)
  {
    playerc_laser_unsubscribe(lasers[i]);
    playerc_laser_destroy(lasers[i]);
    playerc_client_disconnect(clients[i]);
    playerc_client_destroy(clients[i]);
  }

  playerc_mclient_destroy(mclient);

  return(0);
}
コード例 #2
0
int 
player_sd_browse(player_sd_t* sd,
                 double timeout, 
                 int keepalive,
                 player_sd_browse_callback_fn_t cb)
{
  DNSServiceErrorType sdErr;
  player_sd_mdns_t* mdns = (player_sd_mdns_t*)(sd->sdRef);
  int retval=0;
  struct timeval curr;
  double currtime, starttime;
  double polltime;
  
  // Close any previously open session
  if(mdns->browseRef_valid)
  {
    DNSServiceRefDeallocate(mdns->browseRef);
    mdns->browseRef_valid = 0;
  }

  mdns->flags = 0;
  // Initiate the browse session
  if((sdErr = DNSServiceBrowse(&(mdns->browseRef),
                               0,
                               0,
                               PLAYER_SD_SERVICENAME,
                               NULL,
                               browseCB,
                               (void*)sd)) != kDNSServiceErr_NoError)
  {
    PLAYER_ERROR1("DNSServiceBrowse returned error: %d", sdErr);
    return(-1);
  }

  mdns->browseRef_valid = 1;
  mdns->callb = cb;

  // Should we wait here for responses?
  if(timeout != 0.0)
  {
    // Record the current time
    gettimeofday(&curr,NULL);
    starttime = currtime = curr.tv_sec + curr.tv_usec / 1e6;

    // Update until the requested time has elapsed
    while((timeout < 0.0) || ((currtime - starttime) < timeout))
    {
      // Set up to poll on the DNSSD socket
      if(timeout > 0.0)
        polltime = timeout - (currtime - starttime);
      else
        polltime = -1.0;

      if((retval = player_sd_update(sd,polltime)) != 0)
        break;

      gettimeofday(&curr,NULL);
      currtime = curr.tv_sec + curr.tv_usec / 1e6;
    }
  }

  // Should we leave the session open?
  if(!keepalive)
  {
    DNSServiceRefDeallocate(mdns->browseRef);
    mdns->browseRef_valid = 0;
  }
  return(retval);
}