안녕하세요! 소켓 공급업체로서 저는 다양한 애플리케이션에서 비차단 소켓을 사용하는 것의 중요성을 직접 목격했습니다. 이 블로그에서는 비차단 소켓을 사용하는 방법을 안내하고 우리가 제공하는 멋진 소켓에 대한 약간의 정보도 제공하겠습니다.
비차단 소켓이란 무엇입니까?
비차단 소켓을 사용하는 방법을 알아보기 전에 소켓이 무엇인지 빠르게 이해해 보겠습니다. 기존 소켓은 차단됩니다. 즉, 다음과 같은 함수를 호출할 때수신()또는보내다(), 프로그램이 중단되고 작업이 완료될 때까지 기다립니다. 특히 여러 연결을 처리하거나 다른 작업을 동시에 수행해야 하는 애플리케이션에서는 이는 정말 어려운 일이 될 수 있습니다.
반면에 비차단 소켓은 프로그램 실행을 차단하지 않습니다. 비차단 소켓에서 함수를 호출하면 작업이 완료되지 않은 경우에도 즉시 반환됩니다. 이를 통해 프로그램은 소켓 작업이 완료되기를 기다리는 동안 다른 작업을 계속할 수 있습니다.
비차단 소켓 설정
비차단 소켓을 사용하는 첫 번째 단계는 소켓을 생성하고 이를 비차단 모드로 설정하는 것입니다. Python에서는 다음과 같이 할 수 있습니다.
import 소켓 # 소켓 객체 생성 sock = 소켓.socket(socket.AF_INET, 소켓.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 = 소켓(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; }
비차단 작업 처리
소켓을 비차단 모드로 설정한 후에는 작업을 주의 깊게 처리해야 합니다. 당신이 전화할 때수신()또는보내다()비차단 소켓에서는 작업을 즉시 완료할 수 없으면 오류가 반환될 수 있습니다. 대부분의 경우 이 오류는 다음과 같습니다.EWOULDBLOCK또는이득.
Python에서는 다음과 같이 처리할 수 있습니다.
try: data = sock.recv(1024) if data: print(f"Received: {data}") Except 소켓.error as e: if e.errno in (socket.EWOULDBLOCK, 소켓.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) { 버퍼[n] = '\0'; printf("수신됨: %s\n", buffer); }
다중 연결을 위해 비차단 소켓 사용
비차단 소켓의 주요 장점 중 하나는 여러 연결을 동시에 처리할 수 있다는 것입니다. 폴링이라는 기술을 사용하여 여러 소켓에 활동이 있는지 확인할 수 있습니다.
Python에서는 다음을 사용할 수 있습니다.선택하다기준 치수:


import select # 입력을 모니터링할 소켓 목록 = [sock1, sock2] while True: 읽기 가능, 쓰기 가능, 예외 = select.select(inputs, [], inputs) for s in reader: try: data = s.recv(1024) if data: print(f"Received from {s}: {data}") Except 소켓.error as e: if e.errno in (socket.EWOULDBLOCK, 소켓.EAGAIN): else 전달: print(f"오류: {e}") inputs.remove(s) s.close() for s in 예외: 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 활동 = select(max_fd + 1, &tmpfds, NULL, NULL, NULL); if (activity < 0) { perror("select"); 부서지다; } 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) { 버퍼[n] = '\0'; printf("%d에서 수신됨: %s\n", i, buffer); } } } }
우리의 소켓 제품
소켓 공급업체로서 당사는 귀하의 요구 사항을 충족할 수 있는 다양한 소켓을 보유하고 있습니다. 우리를 확인해보세요임팩트 소켓, 높은 토크 애플리케이션을 견딜 수 있도록 설계되었습니다. 우리는 또한열간 단조 핸드 소켓열간 단조 공정을 통해 제작되어 강도와 내구성이 우수합니다. 그리고 물론 우리의핸드 소켓일반적인 용도로 사용하기에 적합합니다.
결론
비차단 소켓은 네트워크 애플리케이션의 성능을 크게 향상시킬 수 있는 강력한 도구입니다. 소켓 작업이 완료되기를 기다리는 동안 프로그램이 계속 실행되도록 허용하면 여러 연결을 보다 효율적으로 처리하고 다른 작업을 동시에 수행할 수 있습니다.
귀하의 프로젝트를 위한 고품질 소켓 구매에 관심이 있다면 주저하지 말고 조달 논의에 연락하십시오. 우리는 귀하의 필요에 맞는 올바른 소켓을 찾는 데 도움을 드리고 있습니다.
참고자료
- W. Richard Stevens의 "UNIX 네트워크 프로그래밍, 1권: 소켓 네트워킹 API"
- Python 공식 문서
소켓그리고선택하다모듈 - 소켓 프로그래밍 기능에 대한 C 표준 라이브러리 문서

