Bagaimana cara saya mencoba membaca data dari soket dengan batas waktu? Saya tahu, pilih, pilih, jajak pendapat, memiliki kolom batas waktu, tetapi menggunakannya menonaktifkan "jalur cepat tcp" di tumpukan reno tcp.
Satu-satunya ide yang saya miliki adalah menggunakan recv (fd, ..., MSG_DONTWAIT) dalam satu lingkaran
Jawaban:
Anda dapat menggunakan fungsi setsockopt untuk mengatur batas waktu pada operasi penerimaan:
Kabarnya di Windows ini harus dilakukan sebelum menelepon
bind
. Saya telah memverifikasi dengan eksperimen bahwa itu dapat dilakukan sebelum atau sesudahbind
di Linux dan OS X.sumber
struct timeval tv;
apakah itu berarti pilih () tidak akan berfungsi juga? Saya mencoba mem-porting kode pilih () saya ke windows dan itu hanya waktu tunggu segera sepertinya mengabaikan nilai yang saya atur pada timeval.Berikut beberapa kode sederhana untuk menambahkan waktu ke
recv
fungsi Anda menggunakanpoll
C:sumber
poll
akan menunggu untuk menerima setidaknya satu byte atau batas waktu, sedangkan saat memanggilrecv
fungsi itu akan menunggusizeof(buf)
byte, menyebabkannya memblokir lagi jika jumlah ini belum tiba, tetapi kali ini tanpa batas waktu.// bekerja juga setelah operasi bind untuk WINDOWS
sumber
Pasang penangan untuk
SIGALRM
, lalu gunakanalarm()
atauualarm()
sebelum pemblokiran biasarecv()
. Jika alarm berbunyi,recv()
akan mengembalikan kesalahan denganerrno
disetel keEINTR
.sumber
LINUX
JENDELA
CATATAN : Anda telah meletakkan pengaturan ini sebelum
bind()
panggilan fungsi untuk menjalankan dengan benarsumber