ioctl의 FIONREAD로 알아온 바이트 크기와 recv
글쓴이: purewell / 작성시간: 수, 2003/05/14 - 1:33오후
소켓에서 데이터를 받아오기 전에 ioctl의 FIONREAD로
얼마만큼의 데이터를 읽을 수 있는지 알 수 있습니다.
그렇다면 그 데이터크기만큼 recv 하면 확실히 받아 오는 것입니까?
즉, for/while 따위로 다 받아질 때까지 삽질 안 해도 되는 것인지요?
unsigned long nRead; int nRes; char cBuff[SOMEBIGNUMBER] nRes=ioctl(csock, FIONREAD, &nRead); ... recv(csock, cBuff, nRead, 0); // HERE!! // recv로 제대로 받을 수 있을지 알 수 없기 때문에 // 보통 for/while을 써서 원하는 데이터만큼 다 받기 // 위해 recv를 여러번 호출해야하는데...
Forums:
[code:1]int recv(int s, void *buf, s
int recv(int s, void *buf, size_t len, int flags);
3번째 flag인자중에 MSG_WAITALL이라는게 있는데....
이걸 쓰면 정의된 버퍼 사이즈 만큼 받을 수가 있습니다...
좀 위험한 방법이긴한데....-_-;;;
飛上
그런것 같네요.
몇몇 사이트를 찾아서 읽어보니 별문제가 없는 것같네요.
http://www-2.cs.cmu.edu/Groups/xavier/src/controller/server.c
그냥 참고해보세요.
------------------------------
좋은 하루 되세요.
혹시나 주의하실점은 ioctl 이 0일 때는 계속 루프가 돌아야 합니다.
혹시나 주의하실점은 ioctl 이 0일 때는 계속 루프가 돌아야 합니다.
예전에, 무조건 내용이 온다고 믿고, 0일 때 종료하게 했던, 아픈 기억이 납니다.
그럼 고운 하루...
=========================
CharSyam ^^ --- 고운 하루
=========================
여러개의 클라이언트를 받아 들이는 소켓이라면 아마도 select()함
여러개의 클라이언트를 받아 들이는 소켓이라면 아마도
select()함수를 쓰거나 fork()를 이용한 방법이 있는데요,,,
제 같은 경우는 주로 select()함수를 이용합니다.
그리고 recv() 보다는 read()함수를 주로 이용합니다....
int nread;
char buffer[1500];
......
fd_set readfds;
......
select( ,,,,, );
......
ioctl( fd, FIONREAD, &nread );
if( nread==0 ) { // 세션 종료시 ioctl은 nread에 0을 대입합니다.
close(fd);
}
else {
readn( fd, Buffer, nread );
process_rutine(Buffer);
}
......
int readn( int fd, char *ptr, int nbytes )
{
int nleft, nread;
nleft = nbytes;
while(nleft>0) {
nread = read(fd, ptr, nleft);
if(nread<0) return(nread);
else if(nread==0) break;
nleft -= nread;
ptr += nread;
}
return(nbytes-nleft);
}
위의 readn()을 사용해서 사용해본 결과
즉,,,, select()와 read() 함수를 사용하여 데몬을 올린 결과
별 문제 없이 잘 돌아 가더군여,,,,
더 좋은 방법이 있으면 소개 좀 시켜 주세여,,,,^^
혹시나한 허접글이었습니다....
^^
*****************************
삽질맨 허접 돌이었습니다.! ㅠ.ㅠ
*****************************
현재 질답란의 분위기상 딴지일것같은 이야기일수도 있습니다만한마디만
현재 질답란의 분위기상 딴지일것같은 이야기일수도 있습니다만
한마디만 하겠습니다. 제소견으로는
무슨 처리를 하시려고 하는지 모르겠지만.
현상황에 얼핏 알맞는 방식은 select+nonblocking+streambuffer
방식인것 같습니다. 저 조합이라면 사이즈가 얼마가 오건 상관없이
스트림에 쌓아두었다가 처리가 가능합니다..
예외인경우인데 한번 받은 데이타를 하나의 패킷이라고 생각하시고
처리하실생각이시면 예외가 생깁니다. send가 연속으로 호출되서
데이타가 올경우 하나로 묶여서 오기때문입니당..
역시 딴지였나요 ㅡㅡㅋ
' 형식이 내용을 규정한다. '
[quote]사이즈가 얼마가 오건 상관없이 스트림에 쌓아두었다가
즉, ioctl로 나온 nRead 값은 버퍼에 잘 받아놓은 녀석이란 소리죠?
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
댓글 달기