내 사랑하는 소켓에 관한 또 다른 질문입니다. 먼저 내 사례가 무엇인지 설명해 드리겠습니다. 그 후에 나는 너에게 나를 괴롭히는 것을 말할 것이다.보내기/받기 소켓 차단 문제
클라이언트와 서버가 있습니다. 두 응용 프로그램 모두 winsock2 구현으로 C++로 작성되었습니다. 연결은 TCP 및 WLAN을 통해 실행됩니다. 그 아마도 문제의 원인과의 definetly communicationchannel 될 것입니다 때문에 무선 랜은 매우 중요하다.
두 개의 소켓을 서버에 연결하고 있습니다. SendSocket 및 ReceiveSocket. 나는 sendocket을 통해 지속적으로 비디오 데이터를 서버로 보내고있다. 데이터가 처리되고 클라이언트로 다시 보내지고 표시됩니다. 각 소켓은 자신 만의 스레드를가집니다.
Videodata가 인코딩되어 있으므로 500kB/s와 비슷합니다. 이 비율을 설명없이 고정 된 것으로 볼 수 있습니다. 클라이언트 볼
완벽한 통신 :
Send Data
Recv Data
Send Data
Recv Data
...
이것은 프레임 (100)과 같은 경우에 대해서이다.
그러나 두 프레임마다 스트림이 4 프레임처럼 얼고 그 후에 계속됩니다. 난 대향하고있어, 문제 그게
(4 프레임은 500ms 같다). 데이터가 제대로 서버 측에 보내집니다
Send Data
Recv Data
Send Data
Send Data
Send Data1 -> blocked send
Recv Data
Recv Data
Send Data2 -> not blocked anymore.
: 스트림에 어떻게됩니까
는 다음과 같습니다.
WLan은 양면 인쇄가 아니기 때문에 (내가 알고있는 한) 발신 통화가 어떤 이유로 우선 순위가 있다고 생각했습니다. 그 다음에 수신 호출이 우선 순위가 지정되므로 호출 수신은 recv 호출이 완료 될 때까지 차단됩니다.
아마도 문제를 일으킬 수있는 하위 계층에서 어떤 일이 일어나는지 알 수 있습니다. Btw. 분명히 확신 할 수는 없지만, 대역폭 문제 만 아니라면 WLAN이 500kB/s를 처리 할 수 있어야한다고 생각합니다. 이 500kB/s는 상류와 하류 모두 함께 사용됩니다. 주의 사항 : 프레임 속도를 1/5로 설정하면 문제가 해결되지 않습니다.
는 나는이 통찰력이 문제를 해결하기 어렵다 알고있다. 지식을 공유 할 수 있다면 행복 할 것이므로 직접 해결할 수도 있습니다.
편집 : 그것의 완벽하게 정상적으로 클라이언트 RECV는 litte을 중단합니다. 하지만 전송을 막아서는 안됩니다. 서버는 데이터를 연속적으로 필요로합니다.
앞서 언급했듯이, 저는 프레임 속도를 1/5로 줄였습니다. 아무 것도 변하지 않았습니다. 따라서 CPU는 수신 버퍼를 비울만큼 빨리 인코딩/디코딩해야합니다. – xeed
실제로 서버가 패키지를받는 동안 송신 버퍼를 가득 채울 수 없습니다. 그래서 또 다른 이유가 있어야합니다. 왜 Send 블록이 필요합니다. 것은 있습니다. 클라이언트에서 recv 및 send 호출이 동시에 수행됩니다. 그리고 그것은 블럭을 일으키는 것이고, 어떻게 생각했는지입니다. – xeed
앞으로 나아갑니다. 서버에서 클라이언트로 이미지를 보내지 않습니다. 지연이 나타나지 않습니다. 그러나 서버에서 IFrame (~ 16000Byte)을 받으면 8을 차단합니다! 루틴을 보냅니다. 따라서 8 개의 프레임은 건너 뜁니다. 서버 호출 전송 여전히 immediatly 반환합니다. 이 8 개의 프레임이 차단되는 동안 서버는 아무 것도받지 않고 아무 것도 보내지 않으므로 클라이언트도 마찬가지입니다. (차단 된 수신을 제외하고) 이 8 개의 프레임은 500ms 동안 나타납니다 ... 15kB를 제공하는 데 오랜 시간이 걸리는 WLAN을 사용한다고 말할 수는 없습니다 ... – xeed