도와주세요!!
글 수 15,339
2004.02.24 16:00:58 (*.186.46.87)
6668
보통 시리얼에서는 고객님께서 하시는 것처럼 처리하지 않는데요...
패켓은 프로토콜에서 재 조립하는 방식으로 처리하거든요...
질문을 하셨으니 답변은 해야겠네요..
유닉스나 리눅스에서 read 함수는 요구한 크기만큼
내용을 모두 얻어오지는 않습니다. ( 물론 상황에 따라서 다르지만요 )
원래는 이런식으로 해야 안전한 코드입니다.
int readcnt;
int readsum;
char readbuff[3500];
readsum = 0;
while( 1 )
{
if( readsum >= 3500 ) break;
readcnt = read(fd,&readbuff[readsum], 3500-readsum);
if( readcnt < 0 )
{
// 에러 처리 ( 보통은 프로그램 중지 )
}
readsum += readcnt;
}
써 넣기도 마찬가지고요...
이렇게 하는 이유는 각 장치별로 한번에 처리하는 내부 버퍼들의 크기에
차이가 있기 때문이거든요...
그래서 시리얼 같은 경우에는 조그만 단위로 나누어서 받고
조립해서 사용합니다.
더구나 시리얼 같은 경우 256 크기 이상이면 에러가 발생해서 버려야할
데이터가 될 확률이 상당히 커지죠...
고객님처럼 한꺼번에 받아서 처리하는 방식은 그리 좋은 방식이
아니라고 생각되네요
패켓은 프로토콜에서 재 조립하는 방식으로 처리하거든요...
질문을 하셨으니 답변은 해야겠네요..
유닉스나 리눅스에서 read 함수는 요구한 크기만큼
내용을 모두 얻어오지는 않습니다. ( 물론 상황에 따라서 다르지만요 )
원래는 이런식으로 해야 안전한 코드입니다.
int readcnt;
int readsum;
char readbuff[3500];
readsum = 0;
while( 1 )
{
if( readsum >= 3500 ) break;
readcnt = read(fd,&readbuff[readsum], 3500-readsum);
if( readcnt < 0 )
{
// 에러 처리 ( 보통은 프로그램 중지 )
}
readsum += readcnt;
}
써 넣기도 마찬가지고요...
이렇게 하는 이유는 각 장치별로 한번에 처리하는 내부 버퍼들의 크기에
차이가 있기 때문이거든요...
그래서 시리얼 같은 경우에는 조그만 단위로 나누어서 받고
조립해서 사용합니다.
더구나 시리얼 같은 경우 256 크기 이상이면 에러가 발생해서 버려야할
데이터가 될 확률이 상당히 커지죠...
고객님처럼 한꺼번에 받아서 처리하는 방식은 그리 좋은 방식이
아니라고 생각되네요