Engellemeyen soketler nasıl kullanılır?

Nov 10, 2025

Mesaj bırakın

Selam! Bir soket tedarikçisi olarak, çeşitli uygulamalarda engellenmeyen soketler kullanmanın önemini ilk elden gördüm. Bu blogda size engellenmeyen soketlerin nasıl kullanılacağını anlatacağım ve ayrıca sunduğumuz harika soketler hakkında da biraz bilgi vereceğim.

Bloke Olmayan Soketler Nelerdir?

Engellemeyen soketlerin nasıl kullanılacağına dalmadan önce, bunların ne olduğunu hızlıca anlayalım. Geleneksel yuvalar engelliyor; bu, aşağıdaki gibi bir işlevi çağırdığınızda anlamına gelir:recv()veyaGöndermek(), programınız duracak ve işlem tamamlanana kadar bekleyecektir. Bu, özellikle birden fazla bağlantıyı yönetmeniz veya aynı anda başka görevleri gerçekleştirmeniz gereken uygulamalarda gerçek bir acı olabilir.

Öte yandan engellemeyen soketler programınızın yürütülmesini engellemez. Engellenmeyen bir yuvada bir işlevi çağırdığınızda, işlem bitmemiş olsa bile hemen geri döner. Bu, programınızın soket işleminin tamamlanmasını beklerken başka şeyler yapmaya devam etmesine olanak tanır.

Engellenmeyen Yuvaları Ayarlama

Engellemeyen yuvaları kullanmanın ilk adımı, bir yuva oluşturmak ve onu engellemesiz moda ayarlamaktır. Python'da bunu şu şekilde yapabilirsiniz:

içe aktarma soketi # Bir soket nesnesi oluşturun sock = soket.socket(socket.AF_INET, soket.SOCK_STREAM) # Soketi engellemesiz moda ayarlayın sock.setblocking(0)

C'de süreç biraz daha karmaşıktır ancak yine de basittir:

#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <fcntl.h> #include <unistd.h> #include <arpa/inet.h> int main() { int sockfd; struct sockaddr_in sunucu_addr; // Bir soket oluştur sockfd = soket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("soket oluşturma başarısız oldu"); dönüş -1; } // Soketi engellemesiz moda ayarlayın int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, işaretler | O_NONBLOCK); // Kodunuzun geri kalanı... 0 değerini döndür; }

Engellemeyen İşlemleri Yönetme

Soketinizi engellemesiz moda ayarladıktan sonra işlemleri dikkatli bir şekilde yapmanız gerekir. aradığınızdarecv()veyaGöndermek()Engellenmeyen bir yuvada, işlem hemen tamamlanamazsa hata verebilir. Çoğu durumda bu hataEWOULDBLOCKveyaYENİDEN.

Python'da bunu şu şekilde halledebilirsiniz:

try: data = sock.recv(1024) if data: print(f"Received: {data}") hariç Socket.error as e: if e.errno in (socket.EWOULDBLOCK, Socket.EAGAIN): # Henüz veri yok, diğer görevlere devam et pass else: # Diğer hataları ele al print(f"Error: {e}")

C'de de benzer:

#include <hata.h> //... karakter arabelleği[1024]; ssize_t n = recv(sockfd, buffer, sizeof(buffer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { // Henüz veri yok, diğer görevlere devam edin } else { // Diğer hataları ele alın perror("recv"); } } else if (n > 0) { tampon[n] = '\0'; printf("Alındı: %s\n", arabellek); }

Birden Fazla Bağlantı için Engellemeyen Soketlerin Kullanılması

Engellenmeyen soketlerin ana avantajlarından biri, aynı anda birden fazla bağlantıyı yönetmenize izin vermeleridir. Birden fazla sokette herhangi bir etkinlik olup olmadığını kontrol etmek için yoklama adı verilen tekniği kullanabilirsiniz.

Python'da şunları kullanabilirsiniz:seçmemodül:

5453

import select # Girişleri izlemek için soket listesi = [sock1, sock2] while True: okunabilir, yazılabilir, istisnai = select.select(inputs, [], inputs) for s okunabilir durumda: try: data = s.recv(1024) if data: print(f"Received from {s}: {data}") hariç soket.hata as e: if e.errno in (socket.EWOULDBLOCK, soket.EAGAIN): pass else: print(f"Error: {e}") inputs.remove(s) s.close() istisnai durumdaki s için: inputs.remove(s) s.close()

C'de şunları kullanabilirsiniz:seçme()işlev:

#include <sys/select.h> //... fd_set readfds; int max_fd; // Dosya tanımlayıcı kümesini başlat FD_ZERO(&readfds); FD_SET(sockfd1, &readfds); FD_SET(sockfd2, &readfds); max_fd = (çorapfd1 > çorapfd2)? çorapfd1 : çorapfd2; while (1) { fd_set tmpfds = readfds; int aktivite = select(max_fd + 1, &tmpfds, NULL, NULL, NULL); if (aktivite < 0) { perror("seç"); kırmak; } for (int i = 0; i <= max_fd; i++) { if (FD_ISSET(i, &tmpfds)) { char buffer[1024]; ssize_t n = recv(i, tampon, sizeof(tampon), 0); if (n < 0) { if (hata == EWOULDBLOCK || errno == EAGAIN) { devam et; } else { perror("recv"); FD_CLR(i, &readfds); kapat(i); } } else if (n > 0) { tampon[n] = '\0'; printf("%d'den alındı: %s\n", i, buffer); } } } }

Priz Tekliflerimiz

Priz tedarikçisi olarak ihtiyaçlarınızı karşılayacak geniş bir priz yelpazesine sahibiz. Bizim göz atınDarbe SoketleriYüksek tork uygulamalarına dayanacak şekilde tasarlanmışlardır. Biz de varSıcak Dövme El SoketleriÜstün güç ve dayanıklılık için sıcak dövme işlemi kullanılarak yapılır. Ve elbette bizimEl Soketlerigenel amaçlı kullanım için mükemmeldir.

Çözüm

Engellemeyen yuvalar, ağ uygulamalarınızın performansını büyük ölçüde artırabilecek güçlü bir araçtır. Soket işlemlerinin tamamlanmasını beklerken programınızın çalışmaya devam etmesine izin vererek, birden fazla bağlantıyı daha verimli bir şekilde yönetebilir ve diğer görevleri aynı anda gerçekleştirebilirsiniz.

Projeleriniz için yüksek kaliteli prizler satın almakla ilgileniyorsanız, satın alma görüşmesi için bizimle iletişime geçmekten çekinmeyin. İhtiyaçlarınıza uygun doğru prizleri bulmanıza yardımcı olmak için buradayız.

Referanslar

  • "UNIX Ağ Programlama, Cilt 1: Soket Ağ İletişimi API'si", W. Richard Stevens
  • Python'un resmi belgelerisoketVeseçmemodüller
  • Soket programlama işlevlerine ilişkin C standart kitaplığı belgeleri
Mason Wilson
Mason Wilson
Mason, 3 yıllık deneyime sahip Yiwu Yuyi İthalat ve İhracat A.Ş., Ltd.'de bir satın alma acentesidir. Yüksek kaliteli hammaddeleri makul fiyatlarla tedarik etmede iyidir, bu da maliyet etkili üretim için çok önemlidir.
Soruşturma göndermek