Hej tamo! Kao dobavljač utičnica, iz prve ruke uvjerio sam se u važnost upotrebe neblokirajućih utičnica u različitim aplikacijama. U ovom blogu ću vas provesti kroz kako da koristite utičnice koje ne blokiraju, a također ću vam dati malo informacija o sjajnim utičnicama koje nudimo.
Šta su utičnice koje ne blokiraju?
Prije nego što uronimo u to kako koristiti utičnice koje ne blokiraju, hajde da brzo shvatimo šta su to. Tradicionalne utičnice se blokiraju, što znači da kada pozovete funkciju kaorecv()ilipošalji(), vaš program će se zaustaviti i čekati dok se operacija ne završi. Ovo može biti prava muka, posebno u aplikacijama u kojima morate rukovati s više konekcija ili istovremeno obavljati druge zadatke.
Utičnice koje ne blokiraju, s druge strane, ne blokiraju izvršavanje vašeg programa. Kada pozovete funkciju na neblokirajućoj utičnici, ona će se odmah vratiti, čak i ako operacija nije završena. Ovo omogućava vašem programu da nastavi raditi druge stvari dok čeka da se operacija utičnice završi.
Postavljanje utičnica koje ne blokiraju
Prvi korak u korištenju neblokirajućih utičnica je kreiranje utičnice i postavljanje u neblokirajući način rada. U Pythonu to možete učiniti na sljedeći način:
import socket # Kreirajte socket objekat sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Postavite utičnicu na neblokirajući način sock.setblocking(0)
U C-u je proces malo složeniji, ali i dalje jednostavan:
#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 server_addr; // Kreiranje utičnice sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("kreiranje utičnice nije uspjelo"); return -1; } // Postavite soket u neblokirajući način int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, zastavice | O_NONBLOCK); // Ostatak vašeg koda... return 0; }
Rukovanje ne-blokirajućim operacijama
Nakon što postavite svoju utičnicu na način rada bez blokiranja, morate pažljivo rukovati operacijama. Kada zovešrecv()ilipošalji()na neblokirajućoj utičnici, može vratiti grešku ako se operacija ne može odmah završiti. U većini slučajeva, ova greška će bitiEWOULDBLOCKiliEGAIN.
U Pythonu ovo možete riješiti na sljedeći način:
try: data = sock.recv(1024) if data: print(f"Primljeno: {data}") osim socket.error kao e: if e.errno in (socket.EWOULDBLOCK, socket.EAGAIN): # Nema dostupnih podataka, nastavite sa drugim zadacima pass else: # Rukovati drugim greškama ili print:(f"E)
U C-u je slično:
#include <errno.h> //... char buffer[1024]; ssize_t n = recv(sockfd, bafer, sizeof(bafer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { // Još nema dostupnih podataka, nastavi s drugim zadacima } else { // Rukovati drugim greškama perror("recv"); } } else if (n > 0) { bafer[n] = '\0'; printf("Primljeno: %s\n", bafer); }
Korištenje neblokirajućih utičnica za višestruke veze
Jedna od glavnih prednosti neblokirajućih utičnica je ta što vam omogućavaju da istovremeno rukujete s više konekcija. Možete koristiti tehniku koja se zove anketiranje da provjerite postoji li aktivnost na više utičnica.
U Pythonu možete koristitiizaberitemodul:


import select # Lista utičnica za nadgledanje ulaza = [sock1, sock2] dok True: čitljivo, upisivo, izuzetan = select.select(inputs, [], inputs) za s u čitljivom: try: data = s.recv(1024) if data: print(f"Primljeno od {s}: {data}") osim ako je asketeer. (socket.EWOULDBLOCK, socket.EAGAIN): pass else: print(f"Greška: {e}") inputs.remove(s) s.close() za s u izuzetnim: inputs.remove(s) s.close()
U C-u možete koristitiodaberite()funkcija:
#include <sys/select.h> //... fd_set readfds; int max_fd; // Inicijaliziraj set deskriptora datoteke FD_ZERO(&readfds); FD_SET(sockfd1, &readfds); FD_SET(sockfd2, &readfds); max_fd = (sockfd1 > sockfd2)? sockfd1 : sockfd2; while (1) { fd_set tmpfds = readfds; int aktivnost = select(max_fd + 1, &tmpfds, NULL, NULL, NULL); if (aktivnost < 0) { perror("select"); break; } for (int i = 0; i <= max_fd; i++) { if (FD_ISSET(i, &tmpfds)) { char bafer[1024]; ssize_t n = recv(i, bafer, sizeof(bafer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { nastavak; } else { perror("recv"); FD_CLR(i, &readfds); zatvori(i); } } else if (n > 0) { bafer[n] = '\0'; printf("Primljeno od %d: %s\n", i, bafer); } } } }
Naša ponuda utičnica
Kao dobavljač utičnica, imamo širok asortiman utičnica koje zadovoljavaju vaše potrebe. Pogledajte našeImpact Sockets, koji su dizajnirani da izdrže primjene s velikim obrtnim momentom. Imamo i miVruće kovane ručne utičnice, koji su napravljeni postupkom vrućeg kovanja za vrhunsku snagu i izdržljivost. I naravno našeHand Socketssavršeni su za opštu upotrebu.
Zaključak
Neblokirajuće utičnice su moćan alat koji može uvelike poboljšati performanse vaših mrežnih aplikacija. Dopuštajući vašem programu da nastavi s izvršavanjem dok čeka da se operacije utičnice dovrše, možete efikasnije upravljati višestrukim vezama i istovremeno obavljati druge zadatke.
Ako ste zainteresirani za kupovinu visokokvalitetnih utičnica za svoje projekte, ne ustručavajte se kontaktirati za raspravu o nabavci. Tu smo da vam pomognemo da pronađete prave utičnice za vaše potrebe.
Reference
- "UNIX mrežno programiranje, svezak 1: API za umrežavanje utičnica" od W. Richarda Stevensa
- Python službena dokumentacija o
socketiizaberitemoduli - Dokumentacija standardne biblioteke C o funkcijama programiranja socketa

