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:


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 belgeleri
soketVeseçmemodüller - Soket programlama işlevlerine ilişkin C standart kitaplığı belgeleri

