Bagaimana cara menggunakan soket yang tidak menghalangi?

Nov 10, 2025

Tinggalkan pesan

Hai! Sebagai pemasok soket, saya telah melihat secara langsung pentingnya penggunaan soket non-pemblokiran dalam berbagai aplikasi. Di blog ini, saya akan memandu Anda tentang cara menggunakan soket anti-pemblokiran, dan juga memberi Anda sedikit info tentang soket luar biasa yang kami tawarkan.

Apa itu Soket Non-Pemblokiran?

Sebelum kita mendalami cara menggunakan soket non-pemblokiran, mari kita pahami dulu apa itu soket non-pemblokiran. Soket tradisional memblokir, yang berarti ketika Anda memanggil fungsi sepertipenerimaan()ataumengirim(), program Anda akan berhenti dan menunggu hingga operasi selesai. Ini bisa sangat menyusahkan, terutama pada aplikasi yang mengharuskan Anda menangani banyak koneksi atau melakukan tugas lain secara bersamaan.

Sebaliknya, soket non-pemblokiran tidak memblokir eksekusi program Anda. Saat Anda memanggil suatu fungsi pada soket non-pemblokiran, fungsi tersebut akan segera kembali, meskipun operasinya belum selesai. Hal ini memungkinkan program Anda untuk terus melakukan hal lain sambil menunggu operasi soket selesai.

Menyiapkan Soket Non-Pemblokiran

Langkah pertama dalam menggunakan soket non-pemblokiran adalah membuat soket dan mengaturnya ke mode non-pemblokiran. Dengan Python, Anda dapat melakukan ini seperti ini:

impor soket # Buat objek soket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Atur soket ke mode non-blocking sock.setblocking(0)

Di C, prosesnya sedikit lebih rumit, namun tetap mudah:

#include <stdio.h> #include <stdlib.h> #include <sys/inet.h> #include <fcntl.h> #include <unistd.h> #include <arpa/inet.h> int main() { int sockfd; struct sockaddr_in server_addr; // Buat soket sockfd = soket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("pembuatan soket gagal"); kembali -1; } // Setel soket ke mode non-pemblokiran int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, bendera | O_NONBLOCK); // Sisa kode Anda... return 0; }

Menangani Operasi Non-Pemblokiran

Setelah Anda menyetel soket ke mode non-pemblokiran, Anda perlu menangani pengoperasiannya dengan hati-hati. Saat Anda meneleponpenerimaan()ataumengirim()pada soket non-pemblokiran, kesalahan mungkin terjadi jika operasi tidak dapat segera diselesaikan. Dalam kebanyakan kasus, kesalahan ini akan terjadiBLOKIRatauDAPATKAN.

Dengan Python, Anda dapat menanganinya seperti ini:

coba: data = sock.recv(1024) if data: print(f"Diterima: {data}") kecuali socket.error as e: if e.errno in (socket.EWOULDBLOCK, socket.EAGAIN): # Belum ada data yang tersedia, lanjutkan dengan tugas lain lewati yang lain: # Tangani kesalahan lainnya print(f"Error: {e}")

Di C, serupa:

#include <errno.h> //... char buffer[1024]; ssize_t n = recv(sockfd, buffer, sizeof(buffer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { // Belum ada data yang tersedia, lanjutkan tugas lainnya } else { // Tangani kesalahan lainnya perror("recv"); } } lain jika (n > 0) { penyangga[n] = '\0'; printf("Diterima: %s\n",buffer); }

Menggunakan Soket Non-Pemblokiran untuk Banyak Koneksi

Salah satu keuntungan utama soket non-pemblokiran adalah soket ini memungkinkan Anda menangani banyak koneksi secara bersamaan. Anda dapat menggunakan teknik yang disebut polling untuk memeriksa apakah ada aktivitas di beberapa soket.

Dengan Python, Anda dapat menggunakanmemilihmodul:

5453

import select # Daftar soket yang akan dipantau input = [sock1, sock2] while True: dapat dibaca, dapat ditulis, luar biasa = select.select(inputs, [], inputs) for s in readable: coba: data = s.recv(1024) if data: print(f"Diterima dari {s}: {data}") kecuali socket.error as e: if e.errno in (socket.EWOULDBLOCK, socket.EAGAIN): berikan yang lain: print(f"Error: {e}") inputs.remove(s) s.close() untuk s dalam pengecualian: inputs.remove(s) s.close()

Di C, Anda dapat menggunakanmemilih()fungsi:

#termasuk <sys/select.h> //... fd_set readfds; int max_fd; // Inisialisasi kumpulan deskriptor file FD_ZERO(&readfds); FD_SET(sockfd1, &readfds); FD_SET(sockfd2, &readfds); max_fd = (sockfd1 > sockfd2)? kaus kaki1 : kaus kaki2; sementara (1) { fd_set tmpfds = readfds; int aktivitas = pilih(max_fd + 1, &tmpfds, NULL, NULL, NULL); if (aktivitas < 0) { perror("pilih"); merusak; } for (int i = 0; i <= max_fd; i++) { if (FD_ISSET(i, &tmpfds)) { char buffer[1024]; ssize_t n = recv(i, buffer, sizeof(buffer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { lanjutkan; } else { perror("rekomendasi"); FD_CLR(i, &bacafds); tutup(saya); } } lain jika (n > 0) { penyangga[n] = '\0'; printf("Diterima dari %d: %s\n",i, buffer); } } } }

Penawaran Soket Kami

Sebagai supplier soket, kami memiliki berbagai macam soket untuk memenuhi kebutuhan Anda. Lihat kamiSoket Dampak, yang dirancang untuk tahan terhadap aplikasi torsi tinggi. Kami juga punyaSoket Tangan Tempa Panas, yang dibuat menggunakan proses penempaan panas untuk kekuatan dan daya tahan yang unggul. Dan tentu saja, milik kitaSoket Tangansempurna untuk penggunaan umum.

Kesimpulan

Soket non-pemblokiran adalah alat canggih yang dapat meningkatkan kinerja aplikasi jaringan Anda secara signifikan. Dengan membiarkan program Anda terus dijalankan sambil menunggu operasi soket selesai, Anda dapat menangani banyak koneksi dengan lebih efisien dan melakukan tugas lain secara bersamaan.

Jika Anda tertarik membeli soket berkualitas tinggi untuk proyek Anda, jangan ragu untuk menghubungi diskusi pengadaan. Kami di sini untuk membantu Anda menemukan soket yang tepat untuk kebutuhan Anda.

Referensi

  • "Pemrograman Jaringan UNIX, Volume 1: Sockets Networking API" oleh W. Richard Stevens
  • Dokumentasi resmi Python distopkontakDanmemilihmodul
  • Dokumentasi perpustakaan standar C tentang fungsi pemrograman soket
Mason Wilson
Mason Wilson
Mason adalah agen pembelian di Yiwu Yuyi Import and Export Co., Ltd. dengan pengalaman 3 tahun, ia pandai mencari bahan baku berkualitas tinggi dengan harga yang wajar, yang sangat penting untuk produksi biaya - yang efektif.
Kirim permintaan