2014-08-29 3 views
1

저는 C 라이브러리 libwebsockets을 사용하고 있습니다. 나는 간단한 에코 서버를 테스트하려고하고있다. 나는 리눅스에서 파이어 폭스와 크롬으로 테스트하고있다. 코드의libwebsockets에서 수신 할 때 Chrome에서 "텍스트 프레임을 UTF-8로 디코딩 할 수 없습니다"라고 말합니다.

조각은 간단하다 :

자바 스크립트

var ws = new WebSocket ("ws://127.0.0.1:9999", "hephaestus"); 

ws.onopen = function() { 
    console.log ('Connection opened.'); 
    setTimeout (function() { 
     ws.send ('This is a hello.\n'); 
    }, 2000); 
}; 

ws.onerror = function() { 
    console.log ('Error in connection'); 
}; 

ws.onclose = function() { 
    console.log ('Connection closed'); 
}; 

ws.onmessage = function (msg) { 
    console.log ('Message received : ' + msg.data); 
}; 

C

ephaestus_callback(struct libwebsocket_context *context, 
struct libwebsocket *wsi, 
enum libwebsocket_callback_reasons reason, 

void *user, void *in, size_t len) 
{ 
    int n, m; 
    unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512 + LWS_SEND_BUFFER_POST_PADDING]; 
    unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING]; 
    unsigned char *ret = "Answer"; 

    switch (reason) 
    { 
     case LWS_CALLBACK_RECEIVE: 
     printf("Received : %s\n",in); 
     strcpy (p, ret); 
     n = libwebsocket_write (wsi, buf, LWS_SEND_BUFFER_POST_PADDING + 512 + LWS_SEND_BUFFER_PRE_PADDING, LWS_WRITE_TEXT); 
     printf ("Wrote %d bytes.\n", n); 
     break; 
    } 

} 

내가의 브라우저에서 '이것은 인사는'수신 할 수 있지만, 내가 대답을 보낼 때, 그것은 534 바이트를 썼다. 그러나 hte 자바 측에서 웹 소켓은 연결된다. 이온이 닫히고 Chrome에서 "텍스트 프레임을 UTF-8로 디코딩 할 수 없습니다"라고 표시됩니다.

"Answer"문자열에 < 128 문자 만 있으므로 혼동 스럽습니다. 그렇다면 UTF-8이어야합니다. 맞습니까?

+0

'unsigned char ret [] = "대답"; "더 좋을 것입니다. – Coconop

답변

2

나는 "대답"문자열에 단지 < 128 문자 만 있기 때문에 혼동 스럽습니다. 그렇기 때문에 UTF-8이어야합니다. 맞습니까?

정말 이니?

돌아 오는 중 p; 즉 buf인데, 크기는 LWS_SEND_BUFFER_PRE_PADDING + 512 + LWS_SEND_BUFFER_POST_PADDING이지만 "대답"의 6 자와 \0 만 설정하고 있습니다.

내 생각에 나머지 buf은 임의의 바이트를 포함하고 있으며, 대부분 UTF-8 문자가 없습니다.

0으로 버퍼를 채우고 strncpy을 사용해야합니다.

+1

예, 실제로 그게 해결되었습니다. 나는 버퍼의 나머지를 memset하는 것을 잊었다. Ho 게다가, 나는'len' 인수도 잘못 알고있다 : 누군가가 같은 문제에 걸려 넘어지면, LWS POST와 PRE 패딩을 포함한 ** 데이터의 길이가 아니다. :-) 빠른 답변을 주셔서 감사합니다 – nschoe

+0

데이터를 쓰고 난 후에 memeset 버퍼를 만들었지 만 여전히 동일한 오류가 발생합니다. CPP와 동일한 길이에서 보내는 길이는 @ 자바 스크립트를 받고 있습니다. – venkat2010