Diwaker Gupta created THRIFT-1676:
-------------------------------------

             Summary: Allow specifying IP/hostname in TServer::serve
                 Key: THRIFT-1676
                 URL: https://issues.apache.org/jira/browse/THRIFT-1676
             Project: Thrift
          Issue Type: Improvement
          Components: C++ - Library
    Affects Versions: 0.8
         Environment: Mac OS X. Thrift 0.8.0.
            Reporter: Diwaker Gupta
            Assignee: Jake Farrell


Thrift doesn't allow users to specify which IP/hostname to use for bind. As a 
result, a Thrift server usually ends up listening on ALL interfaces on a 
machine (bind uses INADDR_ANY). This is clearly undesirable in many cases where 
we may want to restrict connectivity to localhost or to within a particular 
subnet or targeted towards a specific host or IP.

Here's a example of what TNonblockingServer does:

{code}
// Wildcard address
  error = getaddrinfo(NULL, port, &hints, &res0);
  if (error) {
    throw TException("TNonblockingServer::serve() getaddrinfo " +
                     string(gai_strerror(error)));
  }

  // Pick the ipv6 address first since ipv4 addresses can be mapped
  // into ipv6 space.
  for (res = res0; res; res = res->ai_next) {
    if (res->ai_family == AF_INET6 || res->ai_next == NULL)
      break;
  }
{code}

As can be seen, the above code fragment provides NULL as the first param to 
getaddrinfo and always specifies AI_PASSIVE. This results in the behavior I 
described above.

A better approach IMO is to provide the following interface instead:

{code}
TServer::serve(const char* hostOrIp, int port)
{code}

This is consistent with what other modern server frameworks do (node.js, netty 
etc.)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to