[ 
https://issues.apache.org/jira/browse/THRIFT-1944?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13841469#comment-13841469
 ] 

Joseph Urciuoli commented on THRIFT-1944:
-----------------------------------------

Thanks for this fix! A couple of issues I ran into though using c++ on windows.
1) sockaddr type isn't always large enough for the return of getsockname. 
sockaddr_storage is recommended data type for this. I think main case is ipv6
2) errno is not the correct method of getting the error in windows. Should be 
WSAGetLastError(). 

See recommended main code snippet below:

        // retrieve bind info
        if (port_ == 0 && retries <= retryLimit_) {
          struct sockaddr_storage sa;
          socklen_t len = sizeof(sa);
          std::memset(&sa, 0, len);
          if (getsockname(serverSocket_, (sockaddr*)&sa, &len) < 0) {
            #ifdef _WIN32
                int errno_copy = WSAGetLastError();
            #else
                int errno_copy = errno;
            #endif
            GlobalOutput.perror("TServerSocket::getPort() getsockname() ", 
errno_copy);
          }
          else {
            if (sa.ss_family == AF_INET6) {
              const struct sockaddr_in6*
                sin = reinterpret_cast<const struct sockaddr_in6 *>(&sa);
              port_ = ntohs(sin->sin6_port);
            }
            else {
              const struct sockaddr_in*
                sin = reinterpret_cast<const struct sockaddr_in *>(&sa);
              port_ = ntohs(sin->sin_port);
            }
          }
        }

> Binding to zero port
> --------------------
>
>                 Key: THRIFT-1944
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1944
>             Project: Thrift
>          Issue Type: Improvement
>          Components: C++ - Library
>    Affects Versions: 0.9
>         Environment: All platforms
>            Reporter: Akshat Aranya
>            Assignee: Ben Craig
>              Labels: bind
>             Fix For: 1.0
>
>         Attachments: patch-THRIFT-1944-java.patch, 
> patch-THRIFT-1944-updated.patch, patch-THRIFT-1944.patch
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> This patch builds upon a previously submitted patch that was not accepted 
> (THRIFT-966).  The purpose of this patch is to allow TServerSocket to bind to 
> port zero, that is, have the server socket be assigned a port by the OS.  
> This patch provides a way to query the port after the socket has been bound 
> and determine the OS assigned port



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to