У меня есть объект sockaddr_storage, и мне нужно заполнить его значениями, предоставленными пользователем. Обратите внимание, что пользователь может предоставить либо AF_INET
, либо AF_INET6
как домен для заполнения структуры.Заполнить sockaddr_storage struct со значениями sockaddr_in
void fill(sockaddr_storage &addrStruct, int domain,
const char addr[], const int port)
{
std::memset(&addrStruct, 0, sizeof(addrStruct));
switch(domain) {
case AF_INET: addrStruct.sin_family = AF_INET;
addrStruct.sin_port= htons(port);
inet_pton(AF_INET, addr, addrStruct.sin_addr);
case AF_INET6: ....
....
....
default: ....
}
}
Довольно уверен, что это не работает, так как addrStruct
имеет тип struct sockaddr_storage
и эти элементы присутствуют в struct sockaddr_in
. Я также пробовал static_cast<sockaddr_in>(addrStruct).sin_port
и аналогичный, но это снова не работает. Итак, как я должен заполнять эту структуру, чтобы она сохраняла допустимые значения при соблюдении выравнивания литых структур.
Используйте 'getaddrinfo' вместо того, что вы делаете, и не беспокойтесь об этом. – zwol
@zwol getaddrinfo может увеличить сложность моей функции, так как я уже возвращаю значения (или успехи) вызовов 'inet_pton', мне придется принять еще один вызов. Также 'getaddrinfo' имеет тенденцию возвращать несколько адресов по случаю, я не очень хорошо помню этот сценарий, но это снова увеличило бы сложность. –
Попробуйте. Вы обнаружите, что сложность идет _down_ значительно. – zwol