// bekerja juga setelah operasi ikat untuk WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
Anda dapat menggunakan fungsi setockopt untuk menyetel batas waktu pada operasi penerimaan:
SO_RCVTIMEO
Menyetel nilai batas waktu yang menentukan jumlah waktu maksimum fungsi input menunggu hingga selesai. Itu 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 sebagian atau errnoset ke [EAGAIN] atau [EWOULDBLOCK] jika tidak ada data yang diterima. Default untuk opsi ini adalah nol, yang menunjukkan bahwa operasi penerimaan tidak akan habis waktu. Opsi ini menggunakan struktur 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);
Dilaporkan pada Windows hal ini harus dilakukan sebelum memanggil bind
. Saya telah memverifikasi melalui eksperimen bahwa ini dapat dilakukan sebelum atau sesudah bind
di Linux dan OS X.
Instal handler untuk SIGALRM
, lalu gunakan alarm()
atau ualarm()
sebelum pemblokiran reguler recv()
. Jika alarm berbunyi, recv()
akan mengembalikan kesalahan dengan errno
setel ke EINTR
.
Berikut beberapa kode sederhana untuk menambahkan waktu tunggu ke recv
Anda menggunakan poll
di C:
struct pollfd fd;
int ret;
fd.fd = mySocket; // your socket handler
fd.events = POLLIN;
ret = poll(&fd, 1, 1000); // 1 second for timeout
switch (ret) {
case -1:
// Error
break;
case 0:
// Timeout
break;
default:
recv(mySocket,buf,sizeof(buf), 0); // get your data
break;
}