Bagikan melalui


Membuat soket untuk klien

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

Untuk membuat soket

  1. Deklarasikan objek addrinfo yang berisi struktur sockaddr dan inisialisasi nilai-nilai ini. Untuk aplikasi ini, keluarga alamat Internet tidak ditentukan sehingga alamat IPv6 atau IPv4 dapat dikembalikan. Aplikasi meminta jenis soket menjadi soket aliran untuk protokol TCP.

    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;
    
  2. Panggil fungsi getaddrinfo yang meminta alamat IP untuk nama server yang diteruskan pada baris perintah. Port TCP pada server yang akan disambungkan klien didefinisikan oleh DEFAULT_PORT sebagai 27015 dalam sampel ini. Fungsi getaddrinfo mengembalikan nilainya sebagai bilangan bulat yang diperiksa kesalahannya.

    #define DEFAULT_PORT "27015"
    
    // Resolve the server address and port
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  3. Buat objek SOCKET yang disebut ConnectSocket.

    SOCKET ConnectSocket = INVALID_SOCKET;
    
  4. Panggil fungsi soket dan kembalikan nilainya ke variabel ConnectSocket. Untuk aplikasi ini, gunakan alamat IP pertama yang dikembalikan oleh panggilan ke getaddrinfo yang cocok dengan keluarga alamat, jenis soket, dan protokol yang ditentukan dalam parameter petunjuk . Dalam contoh ini, soket aliran TCP ditentukan dengan jenis soket SOCK_STREAM dan protokol IPPROTO_TCP. Keluarga alamat dibiarkan tidak ditentukan (AF_UNSPEC), sehingga alamat IP yang dikembalikan bisa berupa alamat IPv6 atau IPv4 untuk server.

    Jika aplikasi klien ingin terhubung hanya menggunakan IPv6 atau IPv4, maka keluarga alamat perlu diatur ke AF_INET6 untuk IPv6 atau AF_INET untuk IPv4 dalam parameter petunjuk .

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo
    ptr=result;
    
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
        ptr->ai_protocol);
    
  5. Periksa kesalahan untuk memastikan bahwa soket adalah soket yang valid.

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

Parameter yang diteruskan ke fungsi soket dapat diubah untuk implementasi yang berbeda.

Deteksi kesalahan adalah bagian kunci dari kode jaringan yang berhasil. Jika panggilan soket gagal, panggilan akan mengembalikan INVALID_SOCKET. Pernyataan if dalam kode sebelumnya digunakan untuk menangkap kesalahan apa pun yang mungkin terjadi saat membuat soket. WSAGetLastError mengembalikan nomor kesalahan yang terkait dengan kesalahan terakhir yang terjadi.

Catatan

Pemeriksaan kesalahan yang lebih luas mungkin diperlukan tergantung pada aplikasi.

Misalnya, mengatur hints.ai_family ke AF_UNSPEC dapat menyebabkan panggilan sambungkan gagal. Jika itu terjadi, gunakan nilai IPv4 (AF_INET) atau IPv6 (AF_INET6) tertentu sebagai gantinya.

WSACleanup digunakan untuk mengakhiri penggunaan DLL WS2_32.

Langkah Berikutnya: Menyambungkan ke Soket

Memulai Dengan Winsock

Menginisialisasi Winsock

Aplikasi Klien Winsock