Ei! Como fornecedor de soquetes, vi em primeira mão a importância do uso de soquetes sem bloqueio em diversas aplicações. Neste blog, vou explicar como usar soquetes sem bloqueio e também fornecer algumas informações sobre os incríveis soquetes que oferecemos.
O que são soquetes sem bloqueio?
Antes de nos aprofundarmos em como usar soquetes sem bloqueio, vamos entender rapidamente o que são. Os soquetes tradicionais estão bloqueando, o que significa que quando você chama uma função comorecv()ouenviar(), seu programa será interrompido e aguardará até que a operação seja concluída. Isso pode ser um verdadeiro incômodo, especialmente em aplicativos onde você precisa lidar com múltiplas conexões ou realizar outras tarefas simultaneamente.
Os soquetes sem bloqueio, por outro lado, não bloqueiam a execução do seu programa. Quando você chama uma função em um soquete sem bloqueio, ela retornará imediatamente, mesmo que a operação não seja concluída. Isso permite que seu programa continue fazendo outras coisas enquanto espera a conclusão da operação do soquete.
Configurando soquetes sem bloqueio
A primeira etapa para usar soquetes sem bloqueio é criar um soquete e configurá-lo para o modo sem bloqueio. Em Python, você pode fazer assim:
import socket # Cria um objeto de soquete sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Define o soquete para o modo sem bloqueio sock.setblocking(0)
Em C, o processo é um pouco mais complicado, mas ainda assim simples:
#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <fcntl.h> #include <unistd.h> #include <arpa/inet.h> int main() { int sockfd; estrutura sockaddr_in server_addr; // Cria um soquete sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("falha na criação do soquete"); retornar -1; } // Define o soquete para modo sem bloqueio int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, sinalizadores | O_NONBLOCK); // Resto do seu código... return 0; }
Lidando com operações sem bloqueio
Depois de definir seu soquete para o modo sem bloqueio, você precisa realizar as operações com cuidado. Quando você ligarecv()ouenviar()em um soquete sem bloqueio, poderá retornar um erro se a operação não puder ser concluída imediatamente. Na maioria dos casos, esse erro seráEWOULDBLOCKouEGAIN.
Em Python, você pode lidar com isso assim:
try: data = sock.recv(1024) if data: print(f"Received: {data}") exceto socket.error as e: if e.errno in (socket.EWOULDBLOCK, socket.EAGAIN): # Nenhum dado disponível ainda, continue com outras tarefas pass else: # Tratar outros erros print(f"Error: {e}")
Em C, é semelhante:
#include <errno.h> //... char buffer[1024]; ssize_t n = recv(sockfd, buffer, sizeof(buffer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { // Nenhum dado disponível ainda, continue com outras tarefas } else { // Tratar outros erros perror("recv"); } } else if (n > 0) { buffer[n] = '\0'; printf("Recebido: %s\n", buffer); }
Usando soquetes sem bloqueio para conexões múltiplas
Uma das principais vantagens dos soquetes sem bloqueio é que eles permitem lidar com várias conexões simultaneamente. Você pode usar uma técnica chamada polling para verificar se há alguma atividade em vários soquetes.
Em Python, você pode usar oselecionemódulo:


import select # Lista de soquetes para monitorar entradas = [sock1, sock2] while True: legível, gravável, excepcional = select.select(inputs, [], inputs) for s in readable: try: data = s.recv(1024) if data: print(f"Recebido de {s}: {data}") exceto socket.error as e: if e.errno in (socket.EWOULDBLOCK, socket.EAGAIN): passe else: print(f"Erro: {e}") inputs.remove(s) s.close() para s em excepcional: inputs.remove(s) s.close()
Em C, você pode usar oselecione()função:
#include <sys/select.h> //... fd_set readfds; int max_fd; // Inicializa o descritor de arquivo set FD_ZERO(&readfds); FD_SET(sockfd1, &readfds); FD_SET(sockfd2, &readfds); max_fd = (sockfd1 > meiafd2)? meiafd1: meiafd2; enquanto (1) {fd_set tmpfds = readfds; atividade int = select(max_fd + 1, &tmpfds, NULL, NULL, NULL); if (atividade < 0) { perror("selecionar"); quebrar; } for (int i = 0; i <= max_fd; i++) { if (FD_ISSET(i, &tmpfds)) { char buffer[1024]; ssize_t n = recv(i, buffer, sizeof(buffer), 0); if (n < 0) { if (errno == EWOULDBLOCK || errno == EAGAIN) { continuar; } else { perror("recv"); FD_CLR(i, &readfds); fechar(eu); } } else if (n > 0) { buffer[n] = '\0'; printf("Recebido de %d: %s\n", i, buffer); } } } }
Nossas ofertas de soquetes
Como fornecedor de tomadas, temos uma ampla gama de tomadas para atender às suas necessidades. Confira nossoSoquetes de impacto, que são projetados para suportar aplicações de alto torque. Nós também temosSoquetes manuais forjados a quente, que são feitos usando um processo de forjamento a quente para maior resistência e durabilidade. E claro, nossoSoquetes manuaissão perfeitos para uso geral.
Conclusão
Os soquetes sem bloqueio são uma ferramenta poderosa que pode melhorar muito o desempenho de seus aplicativos de rede. Ao permitir que seu programa continue em execução enquanto aguarda a conclusão das operações de soquete, você pode lidar com múltiplas conexões com mais eficiência e executar outras tarefas simultaneamente.
Se você estiver interessado em adquirir soquetes de alta qualidade para seus projetos, não hesite em entrar em contato para conversar sobre compras. Estamos aqui para ajudá-lo a encontrar os soquetes certos para suas necessidades.
Referências
- "Programação de rede UNIX, Volume 1: API de rede de soquetes" por W. Richard Stevens
- Documentação oficial do Python sobre o
tomadaeselecionemódulos - Documentação da biblioteca padrão C sobre funções de programação de soquete

