소켓 프로그래밍에서 질문있습니다..
글쓴이: qodwlql / 작성시간: 월, 2009/11/30 - 10:40오전
if (read(aaaaa, cc, 5 ) <= 0) {
LogWrite("Error.",id, 0);
return(-1);
}
bb = atoi(cc);
aa = 5;
while(aa< bb) {
memset(cc, 0x00, sizeof(c));
if (read(aaaaa, cc, 512) <= 0) {
LogWrite("Error.", id, 0);
return(-1);
}
dd= strlen(cc);
aa += dd;
}
=========================================
소켓프로그래밍에서 왜 저기서 aa에다가 5를 지정해주고while 문을 이용해서 다시 512byte 만큼 읽어와서 aa에다가 dd를 더해줘서 반복문을 돌리는지 궁금합니다 ㅠㅠ
Forums:
너무 기본적인
너무 기본적인 내용이라 아무도 답을 안해주시는듯 하네요.
질문을 하시기전에, 소켓에 대한 책이나 글을 깊이 읽어보셨으면 합니다.
: aa에다가 5를 지정해주고 <<
보통 패킷 프로토콜을 만들때, 헤더를 만들고 헤더에 패킷의 사이즈를 넣는 방법을 씁니다.
여튼, 어떠한 이유에서 5byte를 헤더로 만들었고, atoi(cc)를 한걸 보니 읽어온 5byte가 나머지 패킷의 길이네요.
:
인 이유는, 헤더가 5byte니까 aa는 읽은 byte 수를 저장하는 변수로 사용하고 있으므로, 이미 읽은 헤더의 byte가 5라서 5로 초기화 하고
bb는 위에서 설명한거 처럼 패킷의 전체 길이인데, aa=5로 시작하는 것으로 봐서 패킷헤더에 오는 패킷길이는 헤더의 길이5까지도 포함한 길이를 패킷의 전체 길이로 보내는것 같습니다.
그러래서,
는 소켓에서 읽은 byte수가 패킷의 전체길이(bb)보다 작으면 계속 소켓에서 읽을 수 있도록 루프를 돌게 합니다.
: 다시 512byte만큼 읽어와서
이부분의 해석은 틀렷습니다.
read()함수의 설명을 다시 보세요. 512byte만큼 읽어 오는게 아니라, 최대 512byte만큼 읽어 오는겁니다. buffer overflow를 생각하시면 되겠습니다.
즉,
라고 생각하세요.
cc에 읽어와서 저장하고, cc의 길이만큼이 소켓에서 읽은사이즈라고 생각하고( 이건 왜 이렇게 했는지 모르겠군요, read함수의 반환값이 읽은 byte의 수인데,
읽은 byte수를 얘기하는 aa에데가 방금 읽어들인 byte수를 더해서 지금까지 읽은 총 byte로 만듭니다.
일단, 이 소스가 어디서 만들어진 sample소스라면 다른 소스를 보시라고 얘기해 드리고 싶네요. ^^;
時日也放聲大哭
時日也放聲大哭
댓글 달기