Hogyan kell használni a nem blokkoló aljzatokat?

Nov 10, 2025

Hagyjon üzenetet

Szia! Aljzatok szállítójaként saját bőrömön tapasztaltam a nem blokkoló aljzatok használatának fontosságát különböző alkalmazásokban. Ebben a blogban bemutatom, hogyan kell használni a nem blokkoló aljzatokat, és egy kis információt adok az általunk kínált nagyszerű aljzatokról.

Mik azok a nem blokkoló aljzatok?

Mielőtt belemerülnénk a nem blokkoló aljzatok használatába, gyorsan megértsük, mik is azok. A hagyományos aljzatok blokkolnak, ami azt jelenti, hogy amikor meghív egy függvényt, mint plrecv()vagyelküld(), a program leáll, és megvárja, amíg a művelet befejeződik. Ez nagyon fájdalmas lehet, különösen azokban az alkalmazásokban, ahol több kapcsolatot kell kezelnie vagy más feladatokat kell végrehajtania egyidejűleg.

A nem blokkoló socketek viszont nem blokkolják a program végrehajtását. Ha nem blokkoló socketen hív meg egy függvényt, az azonnal visszatér, még akkor is, ha a művelet még nem fejeződött be. Ez lehetővé teszi, hogy a program más tevékenységeket folytasson, miközben vár a socket művelet befejezésére.

Nem blokkoló aljzatok beállítása

A nem blokkoló aljzatok használatának első lépése egy socket létrehozása és nem blokkoló módba állítása. Pythonban ezt a következőképpen teheti meg:

import socket # Socket objektum létrehozása sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Állítsa a socketet nem blokkoló módba sock.setblocking(0)

C-ben a folyamat egy kicsit bonyolultabb, de még mindig egyszerű:

#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 szerver_addr; // Socket létrehozása sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("a socket létrehozása nem sikerült"); visszatérés -1; } // A socket beállítása nem blokkoló módra int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); // A kód többi része... return 0; }

Nem blokkoló műveletek kezelése

Miután beállította az aljzatot nem blokkoló módba, óvatosan kell kezelnie a műveleteket. Amikor hívszrecv()vagyelküld()egy nem blokkoló socketen hibát jelezhet, ha a művelet nem hajtható végre azonnal. A legtöbb esetben ez a hiba leszEWOULDBLOCKvagyVISSZA.

Pythonban ezt így kezelheti:

try: data = sock.recv(1024) if data: print(f"Fogadott: {adat}") kivéve a socket.error-t, mint e: if e.errno in (socket.EWOULDBLOCK, socket.EAGAIN): # Még nem áll rendelkezésre adat, folytassa a többi feladattal pass else: # Egyéb hibák kezelése

C-ben hasonló:

#include <errno.h> //... char puffer[1024]; ssize_t n = recv(sockfd, puffer, sizeof(puffer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { // Még nem állnak rendelkezésre adatok, folytassa a többi feladattal } else { // Egyéb hibák kezelése perror("recv"); } } else if (n > 0) { puffer[n] = '\0'; printf("Fogadott: %s\n", puffer); }

Nem blokkoló aljzatok használata több csatlakozáshoz

A nem blokkoló aljzatok egyik fő előnye, hogy lehetővé teszik több kapcsolat egyidejű kezelését. Használhatja a lekérdezésnek nevezett technikát annak ellenőrzésére, hogy van-e tevékenység több aljzaton.

Pythonban használhatja aválassza kimodul:

5453

import select # List of sockets to monitor inputs = [sock1, sock2] while True: olvasható, írható, kivételes = select.select(inputs, [], inputs) for s in readable: try: data = s.recv(1024) if data: print(f"Fogadott innen: {s.fi:er:er) {dacktaet kivételével, ha. e.errno in (socket.EWOULDBLOCK, socket.EAGAIN): pass else: print(f"Hiba: {e}") inputs.remove(s) s.close() for s in kivételes: inputs.remove(s) s.close()

C-ben használhatja aselect()funkció:

#include <sys/select.h> //... fd_set readfds; int max_fd; // A fájlleírókészlet inicializálása FD_ZERO(&readfds); FD_SET(sockfd1, &readfds); FD_SET(sockfd2, &readfds); max_fd = (sockfd1 > sockfd2)? sockfd1 : sockfd2; while (1) { fd_set tmpfds = readfds; int tevékenység = select(max_fd + 1, &tmpfds, NULL, NULL, NULL); if (tevékenység < 0) { perror("select"); szünet; } for (int i = 0; i <= max_fd; i++) { if (FD_ISSET(i, &tmpfds)) { char puffer[1024]; ssize_t n = recv(i, puffer, sizeof(puffer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { folytatás; } else { perror("recv"); FD_CLR(i, &readfds); bezár(i); } } else if (n > 0) { puffer[n] = '\0'; printf("Fogadott innen: %d: %s\n", i, puffer); } } } }

Socket ajánlataink

Aljzatszállítóként az Ön igényeinek megfelelő aljzatok széles választékával rendelkezünk. Nézze meg a miImpact Sockets, amelyeket úgy terveztek, hogy ellenálljanak a nagy nyomatékú alkalmazásoknak. Nekünk is vanMelegen kovácsolt kézi aljzatok, amelyek forró kovácsolási eljárással készülnek a kiváló szilárdság és tartósság érdekében. És természetesen a miénkKézi aljzatokáltalános használatra tökéletesek.

Következtetés

A nem blokkoló socketek hatékony eszközök, amelyek nagymértékben javíthatják hálózati alkalmazásai teljesítményét. Ha lehetővé teszi, hogy a program a socket műveletek befejezésére várva folytassa a végrehajtást, hatékonyabban kezelhet több kapcsolatot, és egyidejűleg más feladatokat is végrehajthat.

Ha szeretne kiváló minőségű aljzatokat vásárolni projektjeihez, ne habozzon kapcsolatba lépni egy beszerzési megbeszéléssel. Azért vagyunk itt, hogy segítsünk megtalálni az igényeinek megfelelő aljzatokat.

Hivatkozások

  • "UNIX hálózati programozás, 1. kötet: The Sockets Networking API", W. Richard Stevens
  • Python hivatalos dokumentációja afoglalatésválassza kimodulok
  • C szabványos könyvtári dokumentáció a socket programozási funkciókról
Mason Wilson
Mason Wilson
Mason a Yiwu Yuyi Import and Export Co., Ltd. vásárlóügynöke. 3 éves tapasztalattal rendelkezik, és jó minőségű nyersanyagokat szerez ésszerű áron, ami döntő jelentőségű a költség -hatékony termeléshez.
A szálláslekérdezés elküldése