Пример #1
0
//--------------------------------------------------------------------------------------------------
void AtClientServer
(
    SharedData_t* sharedDataPtr
)
{
    struct sockaddr_un addr;
    int epollFd;
    struct epoll_event event;
    char monitorName[MAX_LEN_MONITOR_NAME];
    le_fdMonitor_Ref_t fdMonitorRef;

    LE_INFO("AtClientServer Started !!!");

    ClientData.socketFd = socket(AF_UNIX, SOCK_STREAM, 0);
    LE_ASSERT(ClientData.socketFd != -1);

    epollFd = epoll_create1(0);
    LE_ASSERT(epollFd != -1);

    event.events = EPOLLIN | EPOLLRDHUP;
    event.data.fd = ClientData.socketFd;
    LE_ASSERT(epoll_ctl(epollFd, EPOLL_CTL_ADD, ClientData.socketFd, &event) == 0);

    memset(&addr, 0, sizeof(addr));
    addr.sun_family= AF_UNIX;
    strncpy(addr.sun_path, sharedDataPtr->devPathPtr, sizeof(addr.sun_path)-1);

    LE_ASSERT(bind(ClientData.socketFd, (struct sockaddr*) &addr, sizeof(addr)) != -1);
    LE_ASSERT(listen(ClientData.socketFd, 1) != -1);

    le_sem_Post(sharedDataPtr->semRef);

    ClientData.connFd = accept(ClientData.socketFd, NULL, NULL);
    LE_ASSERT(ClientData.connFd != -1);

    le_sem_Post(sharedDataPtr->semRef);

    snprintf(monitorName, sizeof(monitorName), "Monitor-%d", ClientData.connFd);

    fdMonitorRef = le_fdMonitor_Create(monitorName, dup(ClientData.connFd), RxNewData,
                                       POLLIN | POLLPRI | POLLRDHUP);
    le_fdMonitor_SetContextPtr(fdMonitorRef, sharedDataPtr);
}
Пример #2
0
//--------------------------------------------------------------------------------------------------
le_json_ParsingSessionRef_t le_json_Parse
(
    int fd, ///< File descriptor to read the JSON document from.
    le_json_EventHandler_t  eventHandler,   ///< Function to call when normal parsing events happen.
    le_json_ErrorHandler_t  errorHandler,   ///< Function to call when errors happen.
    void* opaquePtr   ///< Opaque pointer to be fetched by handlers using le_json_GetOpaquePtr().
)
//--------------------------------------------------------------------------------------------------
{
    // Create a Parser.
    Parser_t* parserPtr = NewParser(eventHandler, errorHandler, opaquePtr);

    parserPtr->fd = fd;
    parserPtr->fdMonitor = le_fdMonitor_Create("le_json", fd, FdEventHandler, POLLIN);
    le_fdMonitor_SetContextPtr(parserPtr->fdMonitor, parserPtr);

    // Create the top-level context and push it onto the context stack.
    PushContext(parserPtr, LE_JSON_CONTEXT_DOC, eventHandler);

    return parserPtr;
}
Пример #3
0
static int mqttClient_connect(mqttClient_t* clientData)
{
  struct sockaddr_in address;
  struct addrinfo *result = NULL;
  struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};  
  int rc = LE_OK;

  LE_ASSERT(clientData);

  if (clientData->session.sock != MQTT_CLIENT_INVALID_SOCKET)
  {
    LE_WARN("socket already connected");
    goto cleanup;
  }

  rc = getaddrinfo(clientData->session.config.brokerUrl, NULL, &hints, &result);
  if (rc)
  {
    LE_ERROR("getaddrinfo() failed(%d)", rc);
    goto cleanup;
  }
	
  struct addrinfo* res = result;
  while (res)
  {
    if (res->ai_family == AF_INET)
    {
      result = res;
      break;
    }
			
    res = res->ai_next;
  }

  if (result->ai_family == AF_INET)
  {
    address.sin_port = htons(clientData->session.config.portNumber);
    address.sin_family = AF_INET;
    address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;
  }
  else
  {
    LE_ERROR("find IP('%s') failed", clientData->session.config.brokerUrl);
    rc = LE_FAULT;
    goto cleanup;
  }

  clientData->session.sock = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
  if (clientData->session.sock == -1)
  {
    LE_ERROR("socket() failed(%d)", errno);
    rc = clientData->session.sock;
    goto cleanup;
  }

  clientData->session.sockFdMonitor = le_fdMonitor_Create(MQTT_CLIENT_SOCKET_MONITOR_NAME, clientData->session.sock, mqttClient_socketFdEventHandler, POLLIN | POLLOUT);
  if (!clientData->session.sockFdMonitor)
  {
    LE_ERROR("le_fdMonitor_Create() failed");
    rc = LE_FAULT;
    goto cleanup;
  }

  le_fdMonitor_SetContextPtr(clientData->session.sockFdMonitor, clientData);

  clientData->session.tx.ptr = clientData->session.tx.buf;
  clientData->session.rx.ptr = clientData->session.rx.buf;

  rc = connect(clientData->session.sock, (struct sockaddr*)&address, sizeof(address));
  if (rc == -1)
  {
    rc = le_timer_Start(clientData->session.connTimer);
    if (rc)
    {
      LE_ERROR("le_timer_Start() failed(%d)", rc);
      goto cleanup;
    }

    if (errno != EINPROGRESS)
    {
      LE_ERROR("connect() failed(%d)", errno);
      rc = LE_FAULT;
      goto cleanup;
    }

    LE_DEBUG("connecting('%s')", clientData->session.config.brokerUrl);
    rc = LE_OK;
    goto cleanup;
  }

  LE_DEBUG("connected('%s')", clientData->session.config.brokerUrl);

cleanup:
  freeaddrinfo(result);

  if (rc && (clientData->session.sock != MQTT_CLIENT_INVALID_SOCKET))
  {
    int err = mqttClient_close(clientData);
    if (err)
    {
      LE_ERROR("mqttClient_close() failed(%d)", err);
      goto cleanup;
    }
  }

  return rc;
}