Как да използвам неблокиращи сокети?

Nov 10, 2025

Остави съобщение

Здравейте! Като доставчик на сокети видях от първа ръка значението на използването на неблокиращи сокети в различни приложения. В този блог ще ви преведа как да използвате неблокиращи сокети и също така ще ви дам малко информация за страхотните сокети, които предлагаме.

Какво представляват неблокиращите сокети?

Преди да се потопим в това как да използваме неблокиращи сокети, нека бързо разберем какво представляват те. Традиционните сокети блокират, което означава, че когато извикате функция катоrecv()илиизпрати (), вашата програма ще спре и ще изчака, докато операцията приключи. Това може да бъде истинска болка, особено в приложения, където трябва да управлявате множество връзки или да изпълнявате други задачи едновременно.

Неблокиращите сокети, от друга страна, не блокират изпълнението на вашата програма. Когато извикате функция на неблокиращ сокет, тя ще се върне веднага, дори ако операцията не е завършена. Това позволява на вашата програма да продължи да прави други неща, докато чака операцията на сокета да завърши.

Настройване на неблокиращи сокети

Първата стъпка при използването на неблокиращи сокети е да създадете сокет и да го настроите на неблокиращ режим. В Python можете да направите това така:

import socket # Създаване на сокет обект sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Настройте сокета на неблокиращ режим sock.setblocking(0)

В C процесът е малко по-ангажиран, но все пак ясен:

#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; // Създаване на сокет sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("неуспешно създаване на сокет"); връщане -1; } // Задаване на сокета в неблокиращ режим int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, флагове | O_NONBLOCK); // Останалата част от вашия код... return 0; }

Обработка на неблокиращи операции

След като настроите сокета си в неблокиращ режим, трябва внимателно да боравите с операциите. Когато се обадитеrecv()илиизпрати ()на неблокиращ сокет може да върне грешка, ако операцията не може да бъде завършена незабавно. В повечето случаи тази грешка ще бъдеБИХЕ БЛОКИРАЛилиОТНОВО.

В Python можете да се справите с това по следния начин:

try: data = sock.recv(1024) if data: print(f"Received: {data}") освен socket.error as e: if e.errno in (socket.EWOULDBLOCK, socket.EAGAIN): # Все още няма налични данни, продължете с други задачи pass else: # Обработване на други грешки print(f"Error: {e}")

В C е подобно:

#include <errno.h> //... char буфер [1024]; ssize_t n = recv(sockfd, буфер, sizeof(буфер), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { // Все още няма налични данни, продължете с други задачи } else { // Обработване на други грешки perror("recv"); } } else if (n > 0) {buffer[n] = '\0'; printf("Получено: %s\n", буфер); }

Използване на неблокиращи сокети за множество връзки

Едно от основните предимства на неблокиращите сокети е, че ви позволяват да обработвате множество връзки едновременно. Можете да използвате техника, наречена анкетиране, за да проверите дали има някаква активност на множество сокети.

В Python можете да използватеизберетемодул:

5453

import select # Списък на сокети за наблюдение на входове = [sock1, sock2] while True: readable, writable, exceptional = select.select(inputs, [], inputs) for s in readable: try: data = s.recv(1024) if data: print(f"Получено от {s}: {data}") освен socket.error as e: if e.errno в (socket.EWOULDBLOCK, socket.EAGAIN): предаване else: print(f"Грешка: {e}") inputs.remove(s) s.close() за s в изключителни: inputs.remove(s) s.close()

В C можете да използватеизберете ()функция:

#include <sys/select.h> //... fd_set readfds; int max_fd; // Инициализиране на набора файлови дескриптори FD_ZERO(&readfds); FD_SET(sockfd1, &readfds); FD_SET(sockfd2, &readfds); max_fd = (sockfd1 > sockfd2)? sockfd1: sockfd2; докато (1) { fd_set tmpfds = readfds; int активност = изберете (max_fd + 1, &tmpfds, NULL, NULL, NULL); if (активност < 0) { perror("изберете"); прекъсване; } for (int i = 0; i <= max_fd; i++) { if (FD_ISSET(i, &tmpfds)) { char буфер [1024]; ssize_t n = recv(i, буфер, sizeof(буфер), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { продължи; } else { perror("recv"); FD_CLR(i, &readfds); затвори(i); } } else if (n > 0) {buffer[n] = '\0'; printf("Получено от %d: %s\n", i, буфер); } } } }

Нашите предложения за контакти

Като доставчик на контакти, ние разполагаме с широка гама от контакти, за да отговорим на вашите нужди. Вижте нашитеУдарни гнезда, които са проектирани да издържат на приложения с висок въртящ момент. Ние също имамеГорещо ковани ръчни гнезда, които са направени с помощта на процес на горещо коване за превъзходна здравина и издръжливост. И разбира се, нашатаРъчни гнездаса идеални за употреба с общо предназначение.

Заключение

Неблокиращите сокети са мощен инструмент, който може значително да подобри производителността на вашите мрежови приложения. Като позволите на вашата програма да продължи да се изпълнява, докато чакате операциите на сокета да завършат, можете да обработвате множество връзки по-ефективно и да изпълнявате други задачи едновременно.

Ако се интересувате от закупуване на висококачествени гнезда за вашите проекти, не се колебайте да се свържете с нас за обсъждане на поръчката. Ние сме тук, за да ви помогнем да намерите правилните контакти за вашите нужди.

Референции

  • „UNIX Network Programming, Volume 1: The Sockets Networking API“ от W. Richard Stevens
  • Официална документация на Python загнездоиизберетемодули
  • Документация на стандартната библиотека C за функциите за програмиране на сокет
Мейсън Уилсън
Мейсън Уилсън
Mason е покупателен агент в Yiwu Yuyi Import and Export Co., Ltd. С 3 -годишен опит, той е добър в снабдяването на висококачествени суровини на разумни цени, което е от решаващо значение за ефективното производство.
Изпрати запитване