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