Exemplo n.º 1
0
int main () {
    GC_init();
    int sock = CHECK(socket, AF_INET, SOCK_STREAM, 0);
    sockaddr_in listen_addr = any_addr();
    printf("bind...\n");
    CHECK(bind, sock, (sockaddr*)&listen_addr, sizeof(listen_addr));
    printf("listen...\n");
    CHECK(listen, sock, SOMAXCONN);
    sockaddr_in client_addr;
    socklen_t client_addr_len;
    int new_sock;
    printf("accept...\n");
    do {
        new_sock = CHECK(accept, sock, (sockaddr*)&client_addr, &client_addr_len);
        char* message = recv_string(new_sock);
        puts(message);
        const char* response = process_message((const char*)message);
        puts("Response generated.");
        CHECK(send, new_sock, response, strlen(response) + 1, 0);
        puts("Response sent.\n");
//        char endbuf [MAX_BUFFER];
//        CHECK(recv, new_sock, endbuf, MAX_BUFFER, 0);
//        puts("Close request recieved.");
        CHECK(close, new_sock);
    } while (0);
    CHECK(close, sock);
    return 0;
}
Exemplo n.º 2
0
TAO_Transport *
TAO_UIPMC_Connector::make_connection (TAO::Profile_Transport_Resolver *,
                                      TAO_Transport_Descriptor_Interface &desc,
                                      ACE_Time_Value *)
{
  TAO_UIPMC_Endpoint *uipmc_endpoint =
    dynamic_cast<TAO_UIPMC_Endpoint *> (desc.endpoint ());

  if (uipmc_endpoint == 0)
    return 0;

  const ACE_INET_Addr &remote_address =
    uipmc_endpoint->object_addr ();

#if defined (ACE_HAS_IPV6) && !defined (ACE_HAS_IPV6_V6ONLY)
  // Check if we need to invalidate accepted connections
  // from IPv4 mapped IPv6 addresses
  if (this->orb_core ()->orb_params ()->connect_ipv6_only () &&
      remote_address.is_ipv4_mapped_ipv6 ())
    {
      if (TAO_debug_level > 0)
        {
          ACE_TCHAR remote_as_string[MAXHOSTNAMELEN + 16];

          (void) remote_address.addr_to_string (remote_as_string,
                                                sizeof remote_as_string);

          ORBSVCS_ERROR ((LM_ERROR,
                      ACE_TEXT ("TAO (%P|%t) - UIPMC_Connector::open, ")
                      ACE_TEXT ("invalid connection to IPv4 mapped IPv6 ")
                      ACE_TEXT ("interface <%s>!\n"),
                      remote_as_string));
        }
      return 0;
    }
#endif /* ACE_HAS_IPV6 && ACE_HAS_IPV6_V6ONLY */

  TAO_UIPMC_Connection_Handler *svc_handler = 0;

  ACE_NEW_RETURN (svc_handler,
                  TAO_UIPMC_Connection_Handler (this->orb_core ()),
                  0);

  // Make sure that we always do a remove_reference
  ACE_Event_Handler_var svc_handler_auto_ptr (svc_handler);

  u_short port = 0;
  const ACE_UINT32 ia_any = INADDR_ANY;
  ACE_INET_Addr any_addr(port, ia_any);

#if defined (ACE_HAS_IPV6)
  if (remote_address.get_type () == AF_INET6)
    any_addr.set (port,
                  ACE_IPV6_ANY);
#endif /* ACE_HAS_IPV6 */
  ACE_INET_Addr local_addr(any_addr);
  svc_handler->addr (remote_address);

  int retval= 0;
  while (uipmc_endpoint != 0)
    {
      if (uipmc_endpoint->is_preferred_network ())
        {
          local_addr.set(port, uipmc_endpoint->preferred_network ());
        }
      else
        {
           local_addr.set(any_addr);
        }
      svc_handler->local_addr (local_addr);
      retval = svc_handler->open (0);
      if (retval == 0)
        {
#if defined (ACE_HAS_IPV6)
          const char* prefer_if = uipmc_endpoint->preferred_if();
          if (prefer_if && ACE_OS::strlen(prefer_if))
            {
              if (svc_handler->peer ().set_nic(prefer_if, AF_INET6))
                {
                  if (TAO_debug_level > 0)
                        ORBSVCS_ERROR ((LM_ERROR,
                            "TAO (%P|%t) - UIPMC_Connector::make_connection, "
                            "connection to <%C:%u> - failed to set requested local network interface <%s>\n",
                             uipmc_endpoint->host (),
                             uipmc_endpoint->port (),
                             prefer_if));
                  retval = -1;
                }
            }
#endif /* ACE_HAS_IPV6 */
          break;
        }
      else
       {
           if (TAO_debug_level > 3)
                ORBSVCS_ERROR ((LM_ERROR,
                            "TAO (%P|%t) - UIPMC_Connector::make_connection, "
                            "connection to <%C:%u> from interface <%s> failed (%p)\n",
                             uipmc_endpoint->host (),
                             uipmc_endpoint->port (),
                             uipmc_endpoint->is_preferred_network () ? uipmc_endpoint->preferred_network () : "ANY",
                             ACE_TEXT ("errno")));
       }
      uipmc_endpoint = dynamic_cast<TAO_UIPMC_Endpoint *> (uipmc_endpoint->next());
    }

  // Failure to open a connection.
  if (retval != 0)
    {
      svc_handler->close ();

      if (TAO_debug_level > 0)
        {
          ORBSVCS_ERROR ((LM_ERROR,
                      "TAO (%P|%t) - UIPMC_Connector::make_connection, "
                      "failed to open the connection to <%C:%u>\n",
                      remote_address.get_host_addr (),
                      remote_address.get_port_number ()));
        }

      return 0;
    }

  // After the handler is opened we can try to obtain the real local address.
  svc_handler->peer ().get_local_addr (local_addr);
  svc_handler->local_addr (local_addr);

  if (TAO_debug_level > 2)
    {
      char local_hostaddr[INET6_ADDRSTRLEN];
      local_addr.get_host_addr (local_hostaddr, sizeof local_hostaddr);
      char remote_hostaddr[INET6_ADDRSTRLEN];
      remote_address.get_host_addr (remote_hostaddr, sizeof remote_hostaddr);

      ORBSVCS_DEBUG ((LM_DEBUG,
                  ACE_TEXT ("TAO (%P|%t) - UIPMC_Connector::make_connection, ")
                  ACE_TEXT ("new connection from <%C:%u> to <%C:%u> on ")
                  ACE_TEXT ("HANDLE %d\n"),
                  local_hostaddr,
                  local_addr.get_port_number (),
                  remote_hostaddr,
                  remote_address.get_port_number (),
                  svc_handler->get_handle ()));
    }

  TAO_Transport *transport = svc_handler->transport ();

  // In case of errors transport is zero
  if (transport == 0)
    {
      svc_handler->close ();

      // Give users a clue to the problem.
      if (TAO_debug_level)
          ORBSVCS_ERROR ((LM_ERROR,
                      ACE_TEXT ("TAO (%P|%t) - UIPMC_Connector:")
                      ACE_TEXT (":make_connection, connection to ")
                      ACE_TEXT ("<%C:%u> failed (%p)\n"),
                      uipmc_endpoint->host (),
                      uipmc_endpoint->port (),
                      ACE_TEXT ("errno")));

      return 0;
    }

  // Add the handler to Cache
  retval =
    this->orb_core ()->lane_resources ().transport_cache ().cache_transport (&desc,
                                                                             transport);

  // Failure in adding to cache.
  if (retval == -1)
    {
      svc_handler->close ();

      if (TAO_debug_level)
        {
          ORBSVCS_ERROR ((LM_ERROR,
                      ACE_TEXT ("TAO (%P|%t) - UIPMC_Connector::")
                      ACE_TEXT ("make_connection, could not add the ")
                      ACE_TEXT ("new connection to cache\n")));
        }

      return 0;
    }

  svc_handler_auto_ptr.release ();
  return transport;
}