GNU/Linux >> Belajar Linux >  >> Linux

Linux:apakah ada pembacaan atau pemulihan dari soket dengan batas waktu?

// 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;
}

Linux
  1. Linux – Bisakah Kita Mendapatkan Informasi Kompilator Dari Biner Elf?

  2. Pustaka C untuk membaca versi EXE dari Linux?

  3. Bagaimana cara mengekstrak teks dengan OCR dari PDF di Linux?

  1. Baca dan tulis data dari mana saja dengan pengalihan di terminal Linux

  2. 4 langkah untuk membuat pengguna Linux dari file csv dengan Ansible

  3. Bagaimana cara membaca/menulis semua pengaturan BIOS dari Linux CLI?

  1. Membaca Baris Dari File Dengan Bash:Untuk Vs. Ketika?

  2. Cara Mengirim Email Dengan Lampiran dan Isi dari Linux

  3. Apakah ada STDCALL di Linux?