2008-09-27 7 views
5

C/C++ 소켓 프로그래밍 및 "read (socket, buffer, BUFSIZE)"메서드 사용. 정확하게 "버퍼"는 char와 byte가 같은 것을 알지만 바이트 배열에 얼마나 많은 요소가 들어 있느냐가 중요합니다. 버퍼가 null 문자까지 전체 메시지를 보유 할 수 있어야합니까?C에서 소켓 데이터를 읽는 버퍼를 만드는 방법

+0

이 null 문자는 사용자의 송신자가 보낸 것입니까? –

+0

아니요, 안타깝게도 예상 된 페이로드 끝에 메시지를 추가해야합니다. –

+0

메시지의 크기를 알고 계시거나 어떻게 표시 했습니까? –

답변

12

BUFSIZE는 버퍼의 크기 (바이트)와 같아야합니다. read()는 버퍼가 꽉 찼을 때 읽기를 멈 춥니 다. 다음은 예입니다

#define MY_BUFFER_SIZE 1024 

char mybuffer[MY_BUFFER_SIZE]; 
int nBytes = read(sck, mybuffer, MY_BUFFER_SIZE); 
+0

감사합니다. 내가 뭘 추측하는지 스트림을 읽을 버퍼가 버퍼보다 ​​큰 경우 어떻게됩니까? –

+1

Heat Miser : read()가 0을 반환 할 때까지 계속 읽습니다. –

+1

죄송합니다. 나는 당신이 당신의 독서를 반복해야한다는 것을 의미했다. 루프를 통과 할 때마다 (심지어 내용을 문자열에 추가하는 경우에도) 버퍼에있는 내용을 처리합니다. read()가 0을 반환하면 루프가 완료됩니다. –

0

귀하의 소켓 구현이 확실히 전체 메시지를 개최, 충분한 크기로, 버퍼를 필요로하지 않지만, 당신은 무엇을하고 있는지에 따라 편리 할 수 ​​있습니다.

5

항상 기회가있을 때 sizeof을 사용하십시오. 기본 제공 연산자 sizeof을 사용하면 컴파일러에게 직접 변수를 지정하는 대신 변수의 크기를 계산하도록 요청합니다. 이렇게하면 실제 변수의 크기가 생각한 것과 다른 경우 버그가 발생할 위험이 줄어 듭니다.

그래서, 대신 일을

#define BUFSIZE 1500 
char buffer[BUFSIZE]; 
int n = read(sock, buffer, BUFSIZE); 

정말 인수가 유형의 이름이 아닌 당신이를 sizeof을 인수 주위에 괄호를 필요로하지 않는 방법

char buffer[1500]; 
int n = read(sock, buffer, sizeof buffer); 

공지 사항을 사용해야합니다 .

+0

unwind : C에서 true 또는 C++에서만 true입니까? (미안하지만, 익숙한 승/C). – benc

+0

안녕하세요, 아주 오래된 질문으로 귀찮게해서 죄송합니다. 나는 비슷한 문제에 직면하고 있으며, 당신이 내게 그것을 일으킬 수있는 것에 대해 의견을 제시 할 수 있다면 정말 행복 할 것입니다. 사전에! 희망하지 않아도됩니다. 경우에, 이것은 [질문] (http://stackoverflow.com/questions/12070203/image-stream-sent-over-socket-server-issue)입니다! – Matteo

관련 문제