2017-10-27 25 views
0

nghttp2와 openssl을 사용하여 Amazon AVS 클라우드와 통신하는 C 언어로 애플리케이션을 구현했습니다. 최대 65535 바이트까지만 응답을받을 수 있습니다. 응답이 65535 바이트보다 클 경우 응용 프로그램은 나머지 데이터를 수신 할 수 없으며 응답을 받기 위해 영원히 붙어 있습니다. 앞서 언급했듯이, HTTP/2 연결을 위해 nghttp2 라이브러리를 사용하고 있습니다.AVS에서 http2 연결에 65535 바이트 이상의 데이터를받는 방법은 무엇입니까?

AVS 클라우드에서 65535 바이트가 넘는 데이터 크기를 얻으려면 설정이 필요합니까? 도와주세요.

+1

문제를 나타내는 샘플 코드를 제공해주십시오. – bta

+1

관련 코드를 표시하십시오. Stack Overflow는 Close 이유를 숨 깁니다. * 디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다 . 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. 참조 : [최소의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve). * – jww

답변

0

HTTP/2 흐름 제어를 올바르게 처리하지 않는 것처럼 65535 바이트 만 수신한다는 사실은 많이 냄새를 맡습니다.

nghttp2 라이브러리가 충분하지 않아서 흐름 제어가 올바르게 처리되었는지 확인해야하지만 nghttp2 API를 제대로 사용하지 않는 것입니다 (예 : 알림을 보내지 않음). 콜백) 또는 호출해야하는 흐름 제어를 처리하는 nghttp2 API를 호출하지 않아야합니다.

참조 용으로 흐름 제어 in the specification을 읽을 수 있습니다. 나는 또한 같은 문제에 직면했다

+0

정확합니다. 클라이언트가 자신의 흐름 제어 창도 관리하는 것이 중요합니다. 데이터를받은 후에는 서버에 연결에 대해 더 많은 데이터를 수신 할 수 있음을 알리기 위해 WINDOW_UPDATE 프레임을 내 보내야합니다. 그렇지 않으면 초기 창 (기본값은 65535 바이트)이 소비됩니다! –

+0

nghttp2의'nghttp2_submit_window_update' 메소드를보세요 –

+0

답장을 보내 주셔서 감사합니다. "nghttp2_submit_window_update"로 시도했지만 여전히 65535 바이트 이상의 데이터를 수신 할 수 없습니다. –

0

nghttp2_option_set_no_auto_window_update (옵션 1) API를 통해 빠른 해결 방법으로, 나는 장애인 nghttp2의 자동 윈도우 업데이트 세션을 열고

nghttp2_session_consume (세션을 불리는 동안, stream_id를 , len); nghttp2_submit_window_update (세션, NGHTTP2_FLAG_NONE, stream_id, len); nghttp2_session_send (session);

데이터 청크에서 데이터 청크를 처리 한 후 recv 콜백에서. 나는 아직도 nghttp2의 auto window update 기능을 유지하는 것이 작동하지 않는 이유를 확신하지 못한다.