Bagikan melalui


Membuat Soket untuk Server

Setelah inisialisasi, objek SOCKET harus dibuat untuk digunakan oleh server.

Untuk membuat soket untuk server

  1. Fungsi getaddrinfo digunakan untuk menentukan nilai dalam struktur sockaddr :

    • AF_INET digunakan untuk menentukan keluarga alamat IPv4.
    • SOCK_STREAM digunakan untuk menentukan soket aliran.
    • IPPROTO_TCP digunakan untuk menentukan protokol TCP .
    • bendera AI_PASSIVE menunjukkan pemanggil berniat menggunakan struktur alamat soket yang dikembalikan dalam panggilan ke fungsi ikatan . Ketika bendera AI_PASSIVE diatur dan parameter nodename ke fungsi getaddrinfo adalah penunjuk NULL , bagian alamat IP dari struktur alamat soket diatur ke INADDR_ANY untuk alamat IPv4 atau IN6ADDR_ANY_INIT untuk alamat IPv6.
    • 27015 adalah nomor port yang terkait dengan server yang akan disambungkan klien.

    Struktur addrinfo digunakan oleh fungsi getaddrinfo .

    #define DEFAULT_PORT "27015"
    
    struct addrinfo *result = NULL, *ptr = NULL, hints;
    
    ZeroMemory(&hints, sizeof (hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    
    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  2. Buat objek SOCKET yang disebut ListenSocket untuk server guna mendengarkan koneksi klien.

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. Panggil fungsi soket dan kembalikan nilainya ke variabel ListenSocket. Untuk aplikasi server ini, gunakan alamat IP pertama yang dikembalikan oleh panggilan untuk getaddrinfo yang cocok dengan keluarga alamat, jenis soket, dan protokol yang ditentukan dalam parameter petunjuk . Dalam contoh ini, soket aliran TCP untuk IPv4 diminta dengan keluarga alamat IPv4, jenis soket SOCK_STREAM dan protokol IPPROTO_TCP. Jadi alamat IPv4 diminta untuk ListenSocket.

    Jika aplikasi server ingin mendengarkan di IPv6, maka keluarga alamat perlu diatur ke AF_INET6 dalam parameter petunjuk . Jika server ingin mendengarkan IPv6 dan IPv4, dua soket mendengarkan harus dibuat, satu untuk IPv6 dan satu untuk IPv4. Kedua soket ini harus ditangani secara terpisah oleh aplikasi.

    Windows Vista dan kemudian menawarkan kemampuan untuk membuat soket IPv6 tunggal yang dimasukkan ke dalam mode tumpukan ganda untuk mendengarkan IPv6 dan IPv4. Untuk informasi selengkapnya tentang fitur ini, lihat Soket Tumpukan Ganda.

    // Create a SOCKET for the server to listen for client connections
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
  4. Periksa kesalahan untuk memastikan bahwa soket adalah soket yang valid.

    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    

Langkah Berikutnya: Mengikat Soket

Memulai Dengan Winsock

Menginisialisasi Winsock

Aplikasi Server Winsock