2016-07-21 4 views
1

나는 게임을 만들고 있는데, 프로그램이 사용자가 온라인 상태임을 자동으로 방송합니다. 브로드 캐스트 메시지는 다음과 같이 구성됩니다.
1 바이트 : 0에서 6까지의 값
2-5. 바이트 :는 RGBA 색상
6 -... 바이트 : 사용자 이름
C++ 문자 배열 연결

사용자 이름이 std::string username에 저장되는 동안 제 5 바이트는, char buf_begin에 저장된다.

나는 노력이 :

std::string buf_begin_s(buf_begin); 
std::string buf = buf_begin_s + username; 

sendto(udp_br, buf.c_str(), sizeof(buf.c_str()), 0, (sockaddr *)&to, sizeof(to)); 

buf 문자열 1-5을 포함하지 않는 문제입니다. 바이트, 사용자 이름 만. 당신이 말한대로

+1

아니요, sizeof (포인터)가 아닙니다. 'strlen' 또는'buf.length()'를 시도하십시오. – LogicStuff

+1

'buf는''\ 0 ''을 포함 할 수 있기 때문에'strlen()'은 여기서 작동하지 않습니다. –

답변

1
std::string buf_begin_s(buf_begin); 

는 경우, buf_begin는 5 문자 버퍼이며, 0 buf_begin_s 빈 문자열로 끝나는 경우 첫 번째 문자는 0이 될 수 있습니다. 이 생성자는 '\0' 문자로 끝나는 C 스타일 문자열을 필요로합니다. buf의 첫 번째 문자가 0 바이트이면 이야기의 끝입니다.

버퍼의 5 문자 중 하나도 0이 아닌 경우 생성자가 메모리에서 앞쪽으로 이동하여 '\0' 바이트를 찾으면 정의되지 않은 동작이 발생합니다.

이것은 아마해야합니다 : buf.c_str() 이후

sendto(udp_br, buf.c_str(), sizeof(buf.c_str()), 0, (sockaddr *)&to, sizeof(to)); 

이 세 번째 매개 변수는 sizeof(const char *), 또는 중 4 또는 8, 따라가 될 것이다하는 const char *입니다 :

std::string buf_begin_s(buf_begin, buf_begin+5); 

sendto() 전화 잘못도 이것이 32 또는 64 비트 플랫폼인지 여부 buf에 아무리 많아도 sizeof(buf.c_str())은 항상 4 또는 8이됩니다. 이것은 분명히 잘못되었습니다.

이것은 단순히 buf.size()이어야합니다.