Membuat soket untuk klien
Setelah inisialisasi, objek SOCKET harus dibuat untuk digunakan oleh klien.
Untuk membuat soket
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;
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; }
Buat objek SOCKET yang disebut ConnectSocket.
SOCKET ConnectSocket = INVALID_SOCKET;
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);
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
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk