2013-09-27 2 views
0

내 사랑하는 소켓에 관한 또 다른 질문입니다. 먼저 내 사례가 무엇인지 설명해 드리겠습니다. 그 후에 나는 너에게 나를 괴롭히는 것을 말할 것이다.보내기/받기 소켓 차단 문제

클라이언트와 서버가 있습니다. 두 응용 프로그램 모두 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을 중단합니다. 하지만 전송을 막아서는 안됩니다. 서버는 데이터를 연속적으로 필요로합니다.

답변

0

좋아. 분명히 wlan 문제였습니다. 내 대학에서 공부 했어. 아무도 모른다면 나는 모른다.이제는 간단한 라우터로 테스트 해 보았지만 제대로 작동했습니다. eduroam wlan이 대역폭이나 방향 변경에 약간의 문제가있는 것처럼 보입니다. 나는 그걸 보지 않을 것입니다 ...

1

A가 전송이 소켓 전송 버퍼가 의미 가득 하나 있다는 것을 의미 차단 중 (A) 수신기에서 소켓 수신 버퍼는 수신기가 최대한 빨리 보내는으로 읽는되지 않음을 의미하는 전체이다; 그렇지 않으면 (b) 네트워크 손실로 인해 발신자가 다시 시도하게됩니다. 두 경우 모두 발신자 측에서 할 수있는 일이 없습니다.

누군가가 비 차단 I/O를 해결책으로 언급하고 있지만 차단되지 않은 발신자가 차단하는 발신자가 send() witch의 'errno == EAGAIN/EWOULDBLOCK '은 실제 문제를 전혀 해결하지 못합니다. 다음

+0

앞서 언급했듯이, 저는 프레임 속도를 1/5로 줄였습니다. 아무 것도 변하지 않았습니다. 따라서 CPU는 수신 버퍼를 비울만큼 빨리 인코딩/디코딩해야합니다. – xeed

+0

실제로 서버가 패키지를받는 동안 송신 버퍼를 가득 채울 수 없습니다. 그래서 또 다른 이유가 있어야합니다. 왜 Send 블록이 필요합니다. 것은 있습니다. 클라이언트에서 recv 및 send 호출이 동시에 수행됩니다. 그리고 그것은 블럭을 일으키는 것이고, 어떻게 생각했는지입니다. – xeed

+0

앞으로 나아갑니다. 서버에서 클라이언트로 이미지를 보내지 않습니다. 지연이 나타나지 않습니다. 그러나 서버에서 IFrame (~ 16000Byte)을 받으면 8을 차단합니다! 루틴을 보냅니다. 따라서 8 개의 프레임은 건너 뜁니다. 서버 호출 전송 여전히 immediatly 반환합니다. 이 8 개의 프레임이 차단되는 동안 서버는 아무 것도받지 않고 아무 것도 보내지 않으므로 클라이언트도 마찬가지입니다. (차단 된 수신을 제외하고) 이 8 개의 프레임은 500ms 동안 나타납니다 ... 15kB를 제공하는 데 오랜 시간이 걸리는 WLAN을 사용한다고 말할 수는 없습니다 ... – xeed