[
https://issues.apache.org/jira/browse/MESOS-1919?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14184331#comment-14184331
]
Michael Park commented on MESOS-1919:
-------------------------------------
I agree with [~jvanremoortere] that we should avoid the use of {{std::vector}}
and I'm in favor of the {{union}} approach. It looks to me like you're trying
to piece together an abstraction for IP address (based on the use of
{{in_addr}}) but I think it would make more sense to use {{sockaddr_in}} to
present a *node* instead, which encapsulates an IP address + port number. This
way we can leverage all of the functions that take {{sockaddr *}}.
Here's a sample implementation of it using the {{union}} approach. Implicit
conversion to {{sockaddr *}} is allowed for natural use with functions that
take {{sockaddr *}}, but of course we could make it explicit if we prefer. The
functions {{getAddress}} and {{getPort}} are shown for example purposes.
{code:title=node.h|borderStyle=solid}
class Node {
public:
explicit Node(uint16_t family, uint16_t port, const char *address) :
storage() {
storage.ss_family = family;
int result;
switch (storage.ss_family) {
case AF_INET: {
ipv4.sin_port = htons(port);
result = inet_pton(storage.ss_family, address, &ipv4.sin_addr);
break;
} // case
case AF_INET6: {
ipv6.sin6_port = htons(port);
result = inet_pton(storage.ss_family, address, &ipv6.sin6_addr);
break;
} // case
} // switch
if (result < 0) {
// Error: system
} else if (result == 0) {
// Error: parse
}
}
// ...
operator const sockaddr *() const { return &generic; }
operator sockaddr *() { return &generic; }
std::string getAddress() const {
std::string result;
switch (storage.ss_family) {
case AF_INET: {
char buffer[INET_ADDRSTRLEN];
if (inet_ntop(storage.ss_family, &ipv4.sin_addr, buffer,
sizeof(buffer)) == NULL) {
// Error
}
result = buffer;
break;
}
case AF_INET6: {
char buffer[INET6_ADDRSTRLEN];
if (inet_ntop(storage.ss_family, &ipv6.sin6_addr, buffer,
sizeof(buffer)) == NULL) {
// Error
}
result = buffer;
break;
}
}
return result;
}
uint16_t getPort() const {
uint16_t result;
switch (storage.ss_family) {
case AF_INET: {
result = ipv4.sin_port;
break;
}
case AF_INET6: {
result = ipv6.sin6_port;
break;
}
}
return ntohs(result);
}
private:
union {
sockaddr_storage storage;
sockaddr_in ipv4;
sockaddr_in6 ipv6;
sockaddr generic;
};
};
{code}
> Create IP address abstraction
> -----------------------------
>
> Key: MESOS-1919
> URL: https://issues.apache.org/jira/browse/MESOS-1919
> Project: Mesos
> Issue Type: Task
> Components: libprocess
> Reporter: Dominic Hamon
> Assignee: Evelina Dumitrescu
> Priority: Minor
>
> in the code many functions need only the ip address to be passed as a
> parameter. I don't think it would be desirable to use a struct
> SockaddrStorage (MESOS-1916).
> Consider using a {{std::vector<unsigned char>}} (see {{typedef
> std::vector<unsigned char> IPAddressNumber;}} in the Chromium project)
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)