Anda dapat menggunakan fungsi setsockopt untuk mengatur batas waktu pada operasi penerimaan:
SO_RCVTIMEO
Menyetel nilai batas waktu yang menentukan jumlah waktu maksimum yang menunggu fungsi masukan hingga selesai. Ini menerima struktur timeval dengan jumlah detik dan mikrodetik yang menentukan batas berapa lama menunggu operasi input selesai. Jika operasi penerimaan telah diblokir selama ini tanpa menerima data tambahan, itu akan kembali dengan hitungan parsial atau errno diatur ke [EAGAIN] atau [EWOULDBLOCK] jika tidak ada data yang diterima. Default untuk opsi ini adalah nol, yang menunjukkan bahwa operasi penerimaan tidak boleh habis. Opsi ini membutuhkan struktur interval waktu. Perhatikan bahwa tidak semua implementasi mengizinkan opsi ini disetel.
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
Kabarnya di Windows ini harus dilakukan sebelum menelepon bind
. Saya telah memverifikasi dengan eksperimen bahwa itu dapat dilakukan sebelum atau sesudah bind
di Linux dan OS X.