0comments

acceptex 예제

나는 실제로 내가 읽은 기사 (한국어로 작성)로 AcceptEx를 사용하는 방법에 대해 다른 의견을 제안 할 사람을 기다리고 있었다 조금 의심스러웠다. 당신이 말했듯이, SO_CONDITIONAL_ACCEPT를 사용하는 것은 권장되지 않으며 AcceptEx를 사용하려는 사람은 MSDN 페이지를 주의 깊게 읽어야합니다 (다른 모든 창 API 함수에 적용됩니다). 프랭크, 당신은 AcceptEx와 부실 클라이언트 문제에 정교 할 수 있습니까? 알려진 문제입니까? 적절하고 더 나은 방법을 알게되면 예제 코드를 업데이트할 것입니다. (하지만 곧 되지 않습니다. 죄송합니다!) 감사! 로컬 및 원격 주소의 버퍼 크기는 주소가 내부 형식으로 작성되기 때문에 사용 중인 전송 프로토콜에 대한 sockaddr 구조의 크기보다 16바이트 이상이어야 합니다. 예를 들어 sockaddr_in(TCP/IP의 주소 구조)의 크기는 16바이트입니다. 따라서 로컬 및 원격 주소에 대해 최소 32바이트의 버퍼 크기를 지정해야 합니다. AcceptEx()를 호출할 때는 항상 버퍼를 전달하여 결과 연결의 로컬 및 원격 주소를 저장해야 합니다. 예를 들어 웹 서버와 같은 데이터를 보내기 전에 데이터를 수신하는 서버의 경우 연결에서 읽은 데이터의 첫 번째 일괄 처리에 대해 이 버퍼에 공백을 포함할 수 있습니다. 위에서 지적했듯이 수락은 적어도 하나의 바이트가 도착할 때까지 완료되지 않습니다.

코드는 다음과 같이 보일 수 있습니다 : 예제 서버는 또 다른 간단한 에코 서버입니다, 나는 에코 서버에 대해 말한 것을 알고 있지만,이 경우 🙂 괜찮은 예입니다. 서버는 소켓 서버 클래스의 두 인스턴스를 포함 하며 5001 및 5002에서 수신합니다. 5001에서는 데이터가 완료되기 전에 데이터가 도착해야 하는 수락을 수행하고 5002에서는 연결이 설정된 직후에 반환되는 수락을 수행합니다. 서버는 동일한 실행 파일에서 여러 소켓 서버를 패키징하는 방법을 보여 주며(언젠가는 모든 서버가 단일 IO 스레드 풀에서 처리되도록 클래스를 최적화할 것입니다…). 멋진 예제 코드, 내가 실망 하는 유일한 것은 윈도우 XP에 클라이언트 지원의 부족 🙂 당신은 당신의 WordPress.com 계정을 사용 하 여 주석. (로그 아웃 / 변경) 단일 출력 버퍼는 데이터, 로컬 소켓 주소(서버) 및 원격 소켓 주소(클라이언트)를 수신합니다. . 그래서, 얼마나 많은 소켓을 미리 만들어야 하며 더 많은 소켓을 만들어야 할 때 어떻게 알 수 있습니까? 미리 만들어야 하는 소켓 수는 서버가 처리해야 하는 연결 수에 따라 달라지며 구성 가능한 매개 변수입니다.

서버 리소스가 낭비되기 때문에 너무 많은 소켓을 만들고 싶지는 않지만 너무 적은 수의 소켓을 만들면 서버가 느리게 실행되거나 연결이 거부됩니다… 우리가 만든 소켓의 수를 추적하고 완료를 수락하면 “보류 중인 수락” 목록에서 “활성” 목록으로 소켓을 이동합니다. 이러한 방식으로 더 많은 소켓을 만들고 AcceptEx()에 더 많은 호출을 수행해야 하는 시기를 모니터링할 수 있습니다. 그러나 클라이언트가 연결 한 후 즉시 데이터를 보낼 것으로 예상되는 경우 적어도 하나의 바이트가 연결에 도착할 때까지 accept가 완료되지 않습니다. 따라서 악의적인 클라이언트는 연결을 열고 데이터를 보내지 않음으로써 서버에서 서비스 거부 공격을 시도할 수 있습니다. 이렇게 하면 결국 게시한 모든 수락이 모두 사용되고 서버가 수신 대기 백로그 큐를 사용하기 시작합니다. 결국 서버는 수신 대기 백로그 큐를 채우고 연결 시도를 거부하기 시작합니다. 이러한 상황을 방지하기 위해 연결 시도가 발생하고 미해결 허용이 없는 경우 알림을 위해 등록할 수 있습니다. 이 경우 백로그 큐는 연결 요청을 큐에 대기하고 연결이 수락되도록 AcceptEx()에 더 많은 호출을 게시할 수 있습니다. WSAEventSelect()를 사용하여 FD_ACCEPT 이벤트에 등록합니다.

그런 다음 accept 루프를 다음과 같이 구성 할 수 있습니다. .

Comments are closed.