넌블로킹 소켓 예제

메시지를 전송할 수 있는 소켓에 사용할 수 있는 메시지 공간이 없는 경우 일반적으로 () 블록으로 보내십시오. 1. 글쎄, 기술적으로 유일한 가능한 방법은 아니지만 대부분의 대안은 상대적으로 못생겼습니다 – 더 구체적으로, 나는 당신이 문제가 있다는 것을 알아 내기 위해 코드를 추가 한 다음 문제를 해결할 때, 당신은 아마 당신이 단지 를 사용하는 것보다 더 많은 추가 작업을 수행했을 것입니다. 비차단 소켓. 기본적으로 TCP 소켓은 차단 모드에 배치됩니다. 즉, 일부 특정 작업이 완료될 때까지 컨트롤이 프로그램에 반환되지 않습니다. 일반적으로 CAsyncSocket을 사용하는 경우 차단 작업을 사용하지 말고 대신 비동기적으로 작동해야 합니다. 비동기 작업에서 수신을 호출한 후 WSAEWOULDBLOCK 오류 코드를 받는 시점부터 OnReceive 멤버 함수가 호출될 때까지 기다렸다가 다시 읽을 수 있음을 알려줍니다. 비동기 호출은 OnReceive와 같은 소켓의 적절한 콜백 알림 기능을 호출하여 이루어집니다. 이 문제에 대한 해결 방법을 “비차단 소켓”이라고 합니다.

클라이언트 서버 응용 프로그램에서 클라이언트가 서버에 요청을 하면 서버가 요청을 처리하고 응답을 다시 보냅니다. 이를 위해 클라이언트와 서버 모두 먼저 소켓(TCP 또는 UDP)을 통해 서로 연결을 설정해야 합니다. 지난 몇 가지 자습서에서는 클라이언트가 요청 형식으로 데이터를 서버에 보내고 서버가 데이터를 작동할 수 있는 방법을 본 다음 클라이언트에 응답을 다시 보낼 수 있습니다. 위의 예에서는 send_data_task() 및 other_task()의 두 가지 함수가 있습니다. send_data_task()는 많은 데이터를 TCP 서버로 보내려고 시도합니다. other_task() 방금 카운터를 실행합니다. 두 함수를 모두 실행하려고 합니다. 하나씩 실행하면 나중에 실행되는 것을 차단하게 됩니다. 그러나 두 함수를 동시에 진행할 수 있습니다.

비차단 소켓과 발전기를 이용하여 두 가지 기능을 협력적으로 진행하고 있습니다. “비차단” 모드는 소켓의 “플래그” 중 하나를 변경하여 설정됩니다. 플래그는 일련의 비트이며 각 플래그는 소켓의 다른 기능을 나타냅니다. 그래서, 비 차단 모드를 설정하려면 세 단계가 필요합니다 : 그것은 “비 차단”모드에 배치되도록 설명기를 설정할 수 있습니다. 비차단 모드에 놓이면 작업이 완료될 때까지 기다리지 않습니다. 이것은 여러 개의 연결된 소켓 간에 전환해야 하고 프로그램이 “잠길”을 일으키지 않도록 하려는 경우 매우 유용한 도구입니다. connect() API는 약간 다릅니다. 비차단 모드에서 connect()를 호출하려고 하면 API가 즉시 연결할 수 없는 경우 `진행 중인 작업`에 대한 오류 코드가 반환됩니다. connect() 를 다시 호출할 때 나중에 `이미 진행 중인 작업`을 알려 `이미 진행 중`이라고 알려주거나 연결이 수행되었음을 알리는 성공적인 반환 코드를 제공할 수 있습니다. 다음은 전체 예제입니다.

이 서버는 TCP 포트 8080을 열고 수신 대기 소켓을 비차단으로 표시합니다. 그런 다음 서버가 반복하여 새 연결을 요청합니다. 서버가 연결되면 서버가 연결에 무언가를 기록한 다음 닫힙니다. 서버에 대한 연결이 없고 소켓이 차단되지 않은 것으로 표시되어 서버가 연결을 얻지 못하면 서버가 다시 시도하기 전에 잠시 동안 절전 모드로 연결됩니다. 다음 기사에서는 더 많은 예제를 살펴보고 설문 조사 및 설문 조사와 같은 비차단 소켓을 처리하기 위한 다른 인프라를 살펴보겠습니다. fcntl() API를 호출하여 소켓 설명자의 현재 플래그 설정을 로컬 변수로 검색합니다. 이에 대한 대답은 비차단 I/O입니다. 소켓에 플래그를 설정하여 해당 소켓을 비차단으로 표시합니다. 즉, 해당 소켓에서 호출을 수행할 때(예: 읽기 및 쓰기) 호출을 완료할 수 없는 경우 대신 EWOULDBLOCK 또는 EAGAIN과 같은 오류로 실패합니다.

처음에, 나는 어떤 상태에서 가장 좋은 것을 물어봐야한다? 예를 들어 실시간 MMORPG 서버. 비차단 소켓을 사용하는 대신 클라이언트당 스레드를 만들면 어떻게 됩니까? 또는 모든 비차단 소켓이 들어있는 하나의 스레드를 사용하는 경우 어떻게 해야 합니까? 당신은 나에게 장점을 설명 할 수 있습니까? 작업 목록에 작업이 남아 있지 않고 더 이상 소켓/fds를 볼 수 없을 때까지 계속 실행됩니다.