2012-11-30 1 views
0

이 코드는 소켓을 사용하는 "대화방"프로그램에 포함되어 있습니다. 그것은 클라이언트 (myFD)에서 읽고 전면에 사용자 이름을 추가하는 것입니다.
그러나 쓰기 버퍼에 여분의 문자를 쓰는 데 문제가 있습니다. 지난 번에 보낸 내용은 여전히 ​​저장되어 있습니다.너무 많은 문자를 쓰는 C++ 소켓

예를 들어, 처음으로 나는

UN을 보내 (제대로 쓰기) 것 : 안녕하세요.

그러나

는 두 번째 시도에서, 나는 쓸 줄 때, 말, 보낸 메시지가 될 것 "NOT"

UN :

cout을 문 NOTlo 제대로 " cout의 "끝에"lo "가 없지만 클라이언트는 끝에"lo "를 수신합니다. 나는 간단한 것을 간과하고 있는가? 다음은

코드 :

while ((amount_read = read(myFD, buffer, 1024)) > 0) 
{ 
    total = 0; 
    strcpy(second, ""); 
    strcpy(second, username); 
    total += unLength; 
    strcat(second, ": "); 
    total += 2; 
    strcat(second, buffer);//, amount_read); 
    total += amount_read; 
    cout << second << endl; 
    write(myFD, second, total); 
} 

감사합니다!

+0

'\ 0'을 현재 문자열의 끝에 붙이면됩니다. btw cout은 C++ – technosaurus

답변

1

문자열이 null로 끝나지 않으므로 이전 문자열을 인쇄 할 수 있습니다. 문자열 buffer[amount_read]=0의 끝에 \0을 추가하여 수정하거나 다음 반복 전에 전체 문자열을 지울 수 있습니다.

버퍼를 지우려면 memset (buffer,'\0', 1024)을 사용할 수 있습니다. 어쩌면 그것은 가장 빠르지는 않지만 쓰레기 나 데이터를 저장하는 것을 방지하는 것일 수도 있습니다.

+0

입니다. memset을 사용하면 아무 효과가 없습니다. 나는 cout이 제대로 작동하기 때문에 문자열 자체가 아니라고 생각합니다. 그럼 다시, 나는 아마도이 모든 것이 어떻게 작동하는지 오해 할 것입니다. – user1850183

+0

나의 실수, 깨끗한 버퍼 – janisz

+0

아, 아니야 .- 끝까지 널 문자를 넣고 내가 원하는대로 모든 것을 해결했다. 고맙습니다! – user1850183

0

'\0'에 올바르게 입력하지 않았습니다.

전송 내용이 write(myFD, buffer, strlen(buffer)) 인 것 같으면 0 종결자를 제외한 모든 내용을 보내 게됩니다. 아마 memset을했기 때문에 처음으로 작동합니다.

buffer[amount_read]=0;으로 수정 될 가능성이 있습니다.

+0

기능의 시작과 끝 부분에 배치합니다. 아무런 효과가없는 것 같습니다. – user1850183