2013-03-27 4 views
0

C에서 websocket 서버를 구축하고 있습니다. 현재 rfc6455 사양을 따르고 있으며 연결된 클라이언트를 구현할 때까지 관리했습니다. 서로 메시지를 보냅니다.C - websocket - recv는 페이로드 길이 이상을 읽습니다.

i = ''; a = 0; t = setInterval('a++; i += "...................................................................................................."; doSend(a + i);', 20); 

은 무엇 위의 코드를 수행하는 메시지 각 20 밀리 보낼 수 있습니다 : 내 서버의 강도를 테스트하기 위해 나는 초당 동일한 클라이언트에서 여러 개의 메시지를 처리 ​​할 수 ​​있는지 테스트하기 위해 자바 스크립트의 조각을 달렸다. 또한 전송되는 메시지는 모든 메시지에 대해 100 바이트 큽니다. 서버는 처음 360 시간 동안 메시지를 가져 와서 연결된 클라이언트에게 전송하지만 이상한 일이 발생했습니다.

서버가 수신하는 모든 메시지에 대해 메시지의 페이로드 길이는 360 * 100 + 3 = 36003입니다.이 값은 메시지의 첫 번째 부분에 주어 지므로 여기에 의존합니다 메시지는 실제로 36003 바이트 길이입니다.

recv 함수를 사용하여 소켓 연결에서 데이터를 수신하고 지금은 8192 바이트의 버퍼 크기를 갖습니다. 내 버퍼 크기보다 큰 메시지를 받으면 전체 메시지가 수신 될 때까지 recv를 다시 호출하기 만하면됩니다. 기이 한 일은 메시지 번호 360을 받으면 메시지 전체를 수신하기 위해 5 번 (5 * 8192> 40000) 버퍼를 읽어야한다는 것입니다. 읽은 숫자 5 대신 3235 바이트 (36003- (4 * 8192)) recv 함수는 일명 전체 버퍼를 반환합니다. 8192 바이트. 어떤 일이 일어나고 있는지에 대한 단서가 있습니까?

+2

다음 클라이언트 메시지가 시작될 수 있습니다. – simonc

+0

@simonc 외에도 (첫 번째 데이터 부분에있는) 메시지 길이를 확인하고 그 값 이상을 읽는 것이 좋습니다. 이 경우 다음 메시지가 손상되지 않습니다. –

+0

@Eddy_Em 외에도 테스트 용 자바 스크립트 타이머를 올리고 다음 메시지가 서버에 도달하기 전에 36003 바이트 메시지를 완전히 수신 할 수 있는지 확인하는 것이 좋습니다 –

답변

0

@simonc 메시지가 빠르게 수신되면 recv에서받은 동일한 메시지로 병합됩니다. 따라서 버퍼가 예상보다 길면 recv에서받은 메시지를 여러 메시지로 분할해야합니다. 고마워요! :)