WSAASyncSelect를 사용하여 소켓을 비동기 모드로 설정하는 소켓 라이브러리에 문제가 있습니다. 비동기 모드에서 소켓은 비 블로킹 모드 (WSAWOULDBLOCK은 차단되는 모든 작업에서 반환 됨)에 놓이고, 소켓 메시지를 읽을 준비가되었을 때 응용 프로그램에 알리기 위해 윈도우 메시지가 알림 창에 게시됩니다.비동기 소켓에서 데이터를 최적으로 읽음
내 문제는 이것입니다. FD_READ 이벤트를 수신하면 시도하고 recv 할 바이트 수를 알 수 없습니다. 버퍼가 너무 작 으면 winsock은 자동으로 다른 FD_READ 이벤트를 게시하여 읽을 데이터를 더 많이 알려줍니다. 데이터가 매우 빨리 도착하면 FD_READ 메시지로 메시지 대기열을 포화시킬 수 있으며 WM_TIMER 및 WM_PAINT 메시지는 메시지 대기열이 비어있을 때만 게시되므로 많은 데이터를 수신하고 비동기 너무 작은 버퍼가있는 소켓.
버퍼를 만드는 데 얼마나 큰가요? 나는 바이트 수를 얻기 위해 ioctlsocket (FIONREAD)을 사용하여 시도해 보았고 버퍼를 정확하게 만들었지 만 KB192599 명시 적으로 그 접근법이 비효율적이라고 경고했다.
크고 클 것이 아닌 버퍼 크기를 선택하려면 어떻게해야합니까?
나는 가장 현명한 버퍼 크기로 SO_RCVBUF를 사용하려고합니다. –