我移植一個的IPv4應用到AF-獨立代碼庫(它應該與IPv4和IPv6工作)。現在我正在使用sockaddr_storage只要我可以,但現在我必須設置(填充)sockaddr_storage。但我不知道正確的方法是什麼。上面的代碼是:設置的IPv4/IPv6地址和端口一個struct sockaddr_storage的結構
// defined in data_socket.h
struct sockaddr_in laddr;
現在有這個功能,設置sin_addr和sin_port:
void DataSocket::SetLocalAddr(const char *addr, const int port)
{
this->laddr.sin_port = htons(port);
if(addr != NULL)
this->laddr.sin_addr.s_addr = inet_addr(addr);
else
this->laddr.sin_addr.s_addr = inet_addr("0.0.0.0");
}
正如你看到的,這是舊的樣式(使用IPv4)。
現在我的更改如下。首先,我已經改變了sockaddr_in
到sockaddr_storage
// defined in data_socket.h
struct sockaddr_storage laddr;
然後,我改變了上面的代碼以支持IPv4的和 IPv6的:
void DataSocket::SetLocalAddr(const char *addr, const int port)
{
switch (this->GetAddrFamily(addr)) {
case AF_INET:
(struct sockaddr_in *) this->laddr.sin_port = htons(port);
if(addr != NULL)
inet_pton(AF_INET, addr, (struct sockaddr_in *) this->laddr.sin_addr);
else
inet_pton(AF_INET, "0.0.0.0", (struct sockaddr_in *) this->laddr.sin_addr);
break;
case AF_INET6:
(struct sockaddr_in6 *) this->laddr.sin6_port = htons(port);
if(addr != NULL)
inet_pton(AF_INET6, addr, (struct sockaddr_in6 *) this->laddr.sin6_addr);
else
inet_pton(AF_INET6, "0:0:0:0:0:0:0:0", (struct sockaddr_in6 *) this->laddr.sin6_addr);
break;
default:
return NULL;
}
}
哪裏GetAddrFamily()
是:
int DataSocket::GetAddrFamily(const char *addr)
{
struct addrinfo hints, *res;
int status, result;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((status = getaddrinfo(addr, 0, &hints, &res)) != 0)
{
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
return false;
}
result = res->ai_family; // This might be AF_INET, AF_INET6,etc..
freeaddrinfo(res); // We're done with res, free it up
return result;
}
看來我的方法很複雜。這是做到這一點的正確方法嗎?因爲我已經改變了SOCKADDR_IN到struct sockaddr_storage的,其實我只是想這個問題的反面:Getting IPV4 address from a sockaddr structure
我試圖找到最佳的解決方案,例如在這裏:http://www.kame.net/newsletter/19980604/它說,從來沒有使用inet_ntop()
和inet_pton()
,但有些人(比如Beej的網絡教程)說inet_ntop()
和inet_pton()
應該用於IPv6的應用程序。
我的執行方式是否正確或應該更改?
這就是爲什麼我喜歡'boost :: asio :: ip :: address',它將'boost :: asio :: ip :: address_v4'和'boost :: asio :: ip :: address_v6'。 – Chad 2012-07-12 14:00:16
當C獲得成員函數時讓我知道。 – Puppy 2012-07-12 15:59:35
@DeadMG哎呀抱歉'''標籤 – 2012-07-12 16:04:32