2017-05-15 14 views
1

우분투 16.04.2 LTS를 실행하는 Azure 가상 머신에서 coturn 서버를 실행하고 있습니다. 나는 C#으로 TURN 클라이언트를 구현 중이고 서버 구성의 문제, 서버 소프트웨어의 버그 또는 클라이언트의 인코딩 문제라고 생각하고 있습니다.길이가 4로 나눌 수있는 경우 Coturn 문자열 값만 허용됩니다.

나는 처음으로 서버에서 REALM을받을 때 문제를 발견했습니다. 영역 이름은 9 자 였지만 서버에서 NULL자를 추가로 3 개 계속 받았습니다. 내가 보내던 소프트웨어 버전을 변경하려고 할 때 나의 의심이 확인되었다. 길이가 4로 나눌 수없는 경우 서버는 아무 것도 반환하지 않습니다. 이제 알 수없는 특성으로 폐기를 처방하는 적절한 STUN/TURN 사양에 따라 메시지가 자동으로 삭제됩니다.

01-13-00-40-21-12-A4-42-57-9E-20-40-86-81-34-F9-B0-64-C1-E4-00-09-00-10-00-00-04-01-55-6E-61-75-74-68-6F-72-69-7A-65-64-00-15-00-10-39-64-38-35-62-66-61-66-62-63-34-36-30-62-31-66-00-14-00-09-74-65-73-74-72-65-61-6C-6D-00-00-00-80-22-00-04-4E-6F-6E-65 

내가 사양을 사용하고

을 얻을 구문 분석 : 사양 당

, 나는

private void StoreString(AttributeType key, string v, byte[] msg, ref int offset) 
{ 
    byte[] stringBytes = Encoding.UTF8.GetBytes(v); 

    // Attribute header 
    StoreAttributeType(key, msg, ref offset); 
    msg[offset++] = (byte)(stringBytes.Length >> 8); 
    msg[offset++] = (byte)(stringBytes.Length & 0xFF); 

    Array.Copy(stringBytes, 0, msg, offset, stringBytes.Length); 
    offset += stringBytes.Length; 
} 

원시 바이트 (예 문자열 유형 TLV 속성을 저장) UTF-8와 같은 문자열을 인코딩하고

Type: AllocateErrorResponse, Length: 64, ID: 42a41221-9e57-4020-8681-34f9b064c1e4 
Attributes: 
- Type: ErrorCode, Value: Code: Unauthorized, Reason: Unauthorized 
- Type: Nonce, Value: 9d85bfafbc460b1f 
- Type: Realm, Value: testrealm 

Attribute parsing not implemented for 0 
- Length: 128, Value: 22-00-04-4E-6F-6E-65 

type=0 및 0으로 구문 분석하려는 값 123,768,117,345,566,911,253,210 실제로 메시지의 끝과

80-22-00-04-4E-6F-6E-65 

속성 8022이 속성 SOFTWARE으로 정의 된 서버 소프트웨어의 이름이고, 길이는 0x0004하고 값 4E-6F-6E-65 그래서 서버가 모두 반환 텍스트 None

입니다 올바른 값과 모든 올바른 길이의 문자열이 UTF-16 나눌 수있는 길이로 채워진 것 같습니다. 이것은 인코딩 문제로 보이지만 서버의 소프트웨어 버그, 서버의 구성 문제 또는 내 클라이언트의 문제인지는 알 수 없습니다. 나는이 모든 것이 오픈 소스이며 소스 코드를 파고들 수 있다고 생각하지만 필자는 그렇게하기 전에 누군가가 통찰력을 가지기를 바라고있다.

답변

0

음 ...이 말은 RFC에 충분히주의를 지불하지 않을 때 일어나는 것이다 ...

RFC 5389 

15. STUN Attributes 

    After the STUN header are zero or more attributes. Each attribute 
    MUST be TLV encoded, with a 16-bit type, 16-bit length, and value. 
    Each STUN attribute MUST end on a 32-bit boundary. As mentioned 
    above, all fields in an attribute are transmitted most significant 
    bit first. 

는 그래서 키가 각 STUN 속성은 일에 종료해야한다는 것입니다처럼 보인다 32 비트 경계. 따라서 내 9 문자 영역을 읽을 때 남은 바이트를 읽고 버려야합니다.