string HtmlSource; char recvbuf[1500] = ""; while(recv(m_sock, recvbuf, sizeof(recvbuf), 0)!=0) HtmlSource += recvbuf;
이렇게 해서 Html소스를 받고 있는데요...
중간에 보면
뛝 이런것등 이상한 문자들이 껴있네요.
버퍼 사이즈 문제인거 같은데 어떻게 해야 적당한가요?
받은 크기를 받아서 0이 아닌지만 사용할 것이 아니라 recvbuf 를 NUL 로 강제 종료시켜줘야합니다.
---http://coolengineer.com
recv 함수의 결과값을 받아서
buf 의 recv 인덱스를 0 으로 세팅해주세요.
buf[iRcvd] = 0;
----블로그 / 위키 / 리눅스 스크린샷 갤러리
string HtmlSource; char recvbuf[1500] = ""; while(recv(m_sock, recvbuf, sizeof(recvbuf), 0)!=0) { HtmlSource += recvbuf; recvbuf[0] = NULL; }
이렇게 해줘도 똑같네요.
lkjt 님의 문자열 개념이 정립되지 않으신 듯 합니다.
아시다시피, C에서의 문자열은 끝이 NULL(즉, 0)로 끝나는 배열 입니다.
그런데 소켓으로 받은 문자열 버퍼에는 어디가 문자열의 끝인지 알려주는 NULL 문자가 없습니다.
다만, recv 함수의 결과값으로 서버에서 읽혀진 데이터의 바이트 수가 반환되는데, 이것을 바탕으로 버퍼에 직접 NULL 문자를 표시해주게 되는 것입니다.
자, 떠먹여주기는 여기까지... :D
사족이지만..
NULL, NUL에도 차이가 있습니다. :)
http://bbs.kldp.org/viewtopic.php?t=29882
아, 그런말이엿군요.
전 문자열 초기화 시키라는건줄 알고..--;;
맨앞에 널을넣어서 --ㅔ;;;
그런말이엿군요..
흠,,그런데 약간 당황스러운게
배열은
0~1499 까지 있는데 만약에 1500바이트를 받아서 1500를 리턴햇다면 1500번지에 NULL을 넣으란 소리인가요?--;;;
런타임 에러 납니다.
그러니까 배열 사이즈보다 한 바이트 적게 받아야죠
http://home.postech.ac.kr/~sodomau
전 그래서 배열은 한개 크개 했습니다.
여기에도 커다란 취향이 있죠.
버퍼의 크기를 상수로 정해놓고, 배열을 버퍼크기 + 1로 잡을 것이냐, 배열을 버퍼에 맞추고 버퍼 크기 - 1로 받을 것이냐.
제가 권하는 것은
char buf[BUFFER_SIZE]; recv( s, buf, sizeof buf -1,0 )
으로 표현하는 것을 좋아합니다.
아래 둘다 비선호... BUFFER_SIZE 를 MAX_SIZE 바꿔야할일이 생길경우 일일이 바꿔야하므로...
char buf[BUFFER_SIZE]; recv( s, buf, BUFFER_SIZE-1,0 )
char buf[BUFFER_SIZE+1]; recv( s, buf, BUFFER_SIZE,0 )
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
받은 크기를 받아서 0이 아닌지만 사용할 것이 아니라 recvbuf
받은 크기를 받아서 0이 아닌지만 사용할 것이 아니라
recvbuf 를 NUL 로 강제 종료시켜줘야합니다.
---
http://coolengineer.com
recv 함수의 결과값을 받아서buf 의 recv 인덱스를 0 으
recv 함수의 결과값을 받아서
buf 의 recv 인덱스를 0 으로 세팅해주세요.
buf[iRcvd] = 0;
----
블로그 / 위키 / 리눅스 스크린샷 갤러리
string HtmlSource; char recvbuf[1500]
string HtmlSource;
char recvbuf[1500] = "";
while(recv(m_sock, recvbuf, sizeof(recvbuf), 0)!=0)
{
HtmlSource += recvbuf;
recvbuf[0] = NULL;
}
이렇게 해줘도 똑같네요.
이렇게 해줘도 똑같네요.
[quote="lkjt"]string HtmlSource; char
lkjt 님의 문자열 개념이 정립되지 않으신 듯 합니다.
아시다시피, C에서의 문자열은 끝이 NULL(즉, 0)로 끝나는 배열 입니다.
그런데 소켓으로 받은 문자열 버퍼에는 어디가 문자열의 끝인지 알려주는 NULL 문자가 없습니다.
다만, recv 함수의 결과값으로 서버에서 읽혀진 데이터의 바이트 수가 반환되는데, 이것을 바탕으로 버퍼에 직접 NULL 문자를 표시해주게 되는 것입니다.
자, 떠먹여주기는 여기까지... :D
----
블로그 / 위키 / 리눅스 스크린샷 갤러리
사족이지만..NULL, NUL에도 차이가 있습니다. :)h
사족이지만..
NULL, NUL에도 차이가 있습니다. :)
http://bbs.kldp.org/viewtopic.php?t=29882
---
http://coolengineer.com
아, 그런말이엿군요.전 문자열 초기화 시키라는건줄 알고..--;;
아, 그런말이엿군요.
전 문자열 초기화 시키라는건줄 알고..--;;
맨앞에 널을넣어서 --ㅔ;;;
그런말이엿군요..
흠,,그런데 약간 당황스러운게배열은0~1499 까지 있는데
흠,,그런데 약간 당황스러운게
배열은
0~1499 까지 있는데 만약에 1500바이트를 받아서 1500를 리턴햇다면
1500번지에 NULL을 넣으란 소리인가요?--;;;
런타임 에러 납니다.
그러니까 배열 사이즈보다 한 바이트 적게 받아야죠
그러니까 배열 사이즈보다 한 바이트 적게 받아야죠
http://home.postech.ac.kr/~sodomau
전 그래서 배열은 한개 크개 했습니다.
전 그래서 배열은 한개 크개 했습니다.
[quote="lkjt"]전 그래서 배열은 한개 크개 했습니다.[/quo
여기에도 커다란 취향이 있죠.
버퍼의 크기를 상수로 정해놓고, 배열을 버퍼크기 + 1로 잡을 것이냐,
배열을 버퍼에 맞추고 버퍼 크기 - 1로 받을 것이냐.
제가 권하는 것은
으로 표현하는 것을 좋아합니다.
아래 둘다 비선호... BUFFER_SIZE 를 MAX_SIZE 바꿔야할일이 생길경우 일일이 바꿔야하므로...
---
http://coolengineer.com
댓글 달기