Bagikan melalui


Mengubah Struktur Data untuk Aplikasi Winsock IPv6

Saat menambahkan dukungan untuk IPv6, Anda harus memastikan bahwa aplikasi Anda menentukan struktur data berukuran tepat. Ukuran alamat IPv6 jauh lebih besar daripada alamat IPv4. Struktur yang dikodekan secara permanen untuk menangani ukuran alamat IPv4 saat menyimpan alamat IP akan menyebabkan masalah dalam aplikasi Anda, dan harus dimodifikasi.

Praktik Terbaik

Pendekatan terbaik untuk memastikan bahwa struktur Anda berukuran benar adalah menggunakan struktur SOCKADDR_STORAGE. Struktur SOCKADDR_STORAGE agnostik ke versi alamat IP. Ketika struktur SOCKADDR_STORAGE digunakan untuk menyimpan alamat IP, alamat IPv4 dan IPv6 dapat ditangani dengan benar dengan satu basis kode.

Contoh berikut, yang merupakan kutipan yang diambil dari file Server.c yang ditemukan di Lampiran B, mengidentifikasi penggunaan struktur SOCKADDR_STORAGE yang sesuai. Perhatikan bahwa struktur, ketika digunakan dengan benar seperti yang ditunjukkan contoh ini, dengan anggun menangani alamat IPv4 atau IPv6.

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

#define BUFFER_SIZE 512
#define DEFAULT_PORT "27015"

int main(int argc, char **argv)
{
    char Buffer[BUFFER_SIZE] = {0};
    char *Hostname;
    int Family = AF_UNSPEC;
    int SocketType = SOCK_STREAM;
    char *Port = DEFAULT_PORT;
    char *Address = NULL;
    int i = 0;
    DWORD dwRetval = 0;
    int iResult = 0;
    int FromLen = 0;
    int AmountRead = 0;

    SOCKADDR_STORAGE From;

    WSADATA wsaData;

    ADDRINFO *AddrInfo = NULL;
    ADDRINFO *AI = NULL;

    // Parse arguments
    if (argc >= 1) {
        Hostname = argv[1];
    }    

   // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    From.ss_family = (ADDRESS_FAMILY) Family;
    
    //...
        
        return 0;
}

Catatan

Struktur SOCKADDR_STORAGE baru untuk Windows XP.

 

Kode yang Harus Dihindari

Biasanya, banyak aplikasi menggunakan struktur sockaddr untuk menyimpan alamat independen protokol, atau struktur sockaddr_in untuk alamat IP. Baik struktur sockaddr maupun struktur sockaddr_in tidak cukup besar untuk menampung alamat IPv6, dan karenanya keduanya tidak memadai agar aplikasi Anda kompatibel dengan IPv6.

Tugas Pengkodan

Untuk mengubah basis kode yang ada dari IPv4 ke interoperabilitas IPv4 dan IPv6

  1. Dapatkan utilitas Checkv4.exe. Utilitas ini disertakan dengan Microsoft Windows Software Development Kit (SDK).
  2. Jalankan utilitas Checkv4.exe terhadap kode Anda. Pelajari tentang cara menjalankan utilitas Checkv4.exe terhadap file Anda di bagian menggunakan Utilitas Checkv4.exe.
  3. Utilitas memberi tahu Anda tentang penggunaan struktur sockaddr atau sockaddr_in, dan memberikan rekomendasi tentang cara mengganti dengan struktur yang kompatibel dengan IPv6 SOCKADDR_STORAGE.
  4. Ganti contoh apa pun dan kode terkait untuk menggunakan struktur SOCKADDR_STORAGE.

Atau, Anda dapat mencari basis kode Anda untuk instans struktur sockaddr dan sockaddr_in, dan mengubah semua penggunaan tersebut serta kode terkait lainnya yang sesuai menjadi struktur SOCKADDR_STORAGE.

Catatan

Struktur addrinfo dan SOCKADDR_STORAGE mencakup protokol dan alamat anggota keluarga (ai_family dan ss_family), masing-masing. RFC 2553 menentukan anggota ai_family dari addrinfo sebagai int, sementara ss_family ditentukan sebagai short; dengan demikian, salinan langsung antara anggota tersebut menghasilkan kesalahan kompilator.

 

Panduan IPv6 untuk Aplikasi Soket Windows

Soket Tumpukan Ganda untuk Aplikasi Winsock IPv6

Panggilan Fungsi untuk Aplikasi Winsock IPv6

Penggunaan Alamat IPv4 Tertanam

Masalah Antarmuka Pengguna untuk Aplikasi Winsock IPv6

Protokol Yang Mendasar untuk Aplikasi Winsock IPv6