Apple需要IPv6兼容性。似乎有點不成熟,但我認爲有人不得不迫使它被廣泛採用。低級別C API的IPv6兼容性問題
我有一位客戶,他的一些遺留代碼因爲不兼容而不再被批准用於App Store。我沒有自己編寫軟件,並且特別從未涉及過這部分代碼。當談到低級C網絡時,我並不是一個忍者。
我告訴客戶,問題的一部分是,他們有一個IPv4的服務器,並讓我們硬編碼到該服務器的IPv4地址。我將IPv4地址更新爲域名,並告訴他們他們的服務器必須支持IPv6。所以,他們把它們全部移開,在做任何測試之前翻轉開關。幾天前我收到通知,他們店裏的所有軟件都不再有效。這就是我們所處的困境。
這是潛在的很多問題之一,我可以使用一些幫助。
連接到端口的服務器不僅不響應IPv6,還有一些低級別的API正在使用中不兼容。
我遇到的第一件事情就是使用gethostbyname()
。顯然這不是IPv6的能力。我一直試圖用getaddrinfo()
來解決這個問題,但我的sockaddr並不完全一樣。
我能看到的第二個問題是,顯然我需要使用AF_UNSPEC
而不是AF_INET
。所以我試圖用以下方式打開一個插座:
int sockfd = socket(AF_UNSPEC, SOCK_STREAM, 0);
我總是得到-1。
如果我使用AF_INET
打開襪子我得到進一步的,但後來我有這樣的問題:
otherAddr sockaddr * 0x618000220680 0x0000618000220680
sa_len __uint8_t '\x1c'
sa_family sa_family_t '\x1e'
sa_data char [14] "\x13\x88"
otherAddrCast sockaddr * 0x7000052d3c28 0x00007000052d3c28
sa_len __uint8_t '\0'
sa_family sa_family_t '\0'
sa_data char [14] "\x13\x88\"Ԛ\\"
所以一些sa_data
的是一樣的。如果我沒有將sockaddr_in
轉換爲struct sockaddr*
那麼sa_data
是相同的。
問題是我不知道這是什麼意思。幫幫我?
編輯:這是我的代碼。假設我只得到1個地址回來(因爲我)
struct hostent* server = gethostbyname([_hostname UTF8String]);
struct addrinfo *ai;
struct addrinfo hints;
memset(&hints, 0x00, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
NSString* portString = [NSString stringWithFormat:@"%d", _port];
getaddrinfo([_hostname UTF8String], [portString cStringUsingEncoding:kCFStringEncodingASCII] , &hints, &ai);
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
bcopy(server->h_addr, &addr.sin_addr.s_addr, server->h_length);
addr.sin_port = htons(_port);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
_addr = (struct sockaddr*)&addr;
int status = connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));
int status2 = connect(socket(ai->ai_family,ai->ai_socktype,0), ai->ai_addr, ai->ai_addrlen);
你可能需要找到一個IPv6套接字教程。這個問題可能是一個寬泛的stackoverflow。 –
「看起來有點不成熟」 - 是的,只是IPv4地址已經用完了,而且IPv6只有大約20年的標準化。絕對過早... – Olaf
我發現http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html非常有幫助 –