Den Port aus sockaddr.sa_data[14]; auslesen?



  • hallo cpp-forum,

    ich fülle in meinem Programm ein struct addrinfo und erhalte mit getaddrinfo dann laut DNS gültige struct sockaddr zu denen ich mich verbinde.

    struct sockaddr {
       ushort sa_family;
       char   sa_data[14];
    };
    

    Nun möchte ich gerne aus char sa_data[14]; den Port auslesen. Der müsste doch dort drinnen stehen. Nur weiss ich nicht welche Felder des char array die Informationen enthalten.
    Kann mir das hier jemand von euch erklären?





  • muss ich das nicht mit ntohs() machen?

    ich dachte es muss so gehen:
    da der port ja ein unsigned short ist wollte ich zwei char zu einem short zusammen fügen. wohl sa_data[14] und sa_data[13] oder die ersten beiden.
    nur wie? + geht ja nicht, das muss ja auf bit ebene geschehen. ich wollte nur nicht dez in dual umwandeln. dachte jmd hier kennt eine elegante möglichkeit.

    ...
    /*EDIT: (so ist es richtig)*/
    if (sa.sa_family == AF_INET)
    {
    	char buf[INET_ADDRSTRLEN];
    	sockaddr_in& sa_in = reinterpret_cast<sockaddr_in&>(sa);
    	inet_ntop(sa_in.sin_family, &sa_in.sin_addr, buf, sizeof buf);
    	return string(buf);
    }
    else if (sa.sa_family == AF_INET6)
    {
    	char buf[INET6_ADDRSTRLEN];
    	sockaddr_in6& sa_in6 = reinterpret_cast<sockaddr_in6&>(sa);
    	inet_ntop(sa_in6.sin6_family, &sa_in6.sin6_addr, buf, sizeof buf);
    	return string(buf);
    }
    ...
    

    habe ich schon doch so bekomme ich die ip (dottet) nicht den port.



  • Du solltest das Teil erstmal nach sockaddr_in casten, etwa so:

    sockaddr my_sockaddr;
    sockaddr_in& inet_sockaddr = reinterpret_cast<sockaddr_in&>(my_sockaddr);
    

    Dann hast du da auch Felder für Port usw., die du dann noch mit ntohs usw. bearbeiten musst.



  • super 👍 und viel dank euch beiden. wie einfach es doch ist 🙂



  • nimm doch getnameinfo


Anmelden zum Antworten