ioctl의 FIONREAD로 알아온 바이트 크기와 recv

purewell의 이미지

소켓에서 데이터를 받아오기 전에 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를 여러번 호출해야하는데...
kn31232의 이미지

int recv(int s, void *buf, size_t len, int flags);

3번째 flag인자중에 MSG_WAITALL이라는게 있는데....

이걸 쓰면 정의된 버퍼 사이즈 만큼 받을 수가 있습니다...

좀 위험한 방법이긴한데....-_-;;;

飛上

codebank의 이미지

몇몇 사이트를 찾아서 읽어보니 별문제가 없는 것같네요.

http://www-2.cs.cmu.edu/Groups/xavier/src/controller/server.c

그냥 참고해보세요.

------------------------------
좋은 하루 되세요.

charsyam의 이미지

혹시나 주의하실점은 ioctl 이 0일 때는 계속 루프가 돌아야 합니다.

예전에, 무조건 내용이 온다고 믿고, 0일 때 종료하게 했던, 아픈 기억이 납니다.

그럼 고운 하루...

=========================
CharSyam ^^ --- 고운 하루
=========================

dol의 이미지

여러개의 클라이언트를 받아 들이는 소켓이라면 아마도
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() 함수를 사용하여 데몬을 올린 결과
별 문제 없이 잘 돌아 가더군여,,,,
더 좋은 방법이 있으면 소개 좀 시켜 주세여,,,,^^
혹시나한 허접글이었습니다....
^^

*****************************
삽질맨 허접 돌이었습니다.! ㅠ.ㅠ
*****************************

liongo의 이미지

현재 질답란의 분위기상 딴지일것같은 이야기일수도 있습니다만

한마디만 하겠습니다. 제소견으로는

무슨 처리를 하시려고 하는지 모르겠지만.

현상황에 얼핏 알맞는 방식은 select+nonblocking+streambuffer

방식인것 같습니다. 저 조합이라면 사이즈가 얼마가 오건 상관없이

스트림에 쌓아두었다가 처리가 가능합니다..

예외인경우인데 한번 받은 데이타를 하나의 패킷이라고 생각하시고

처리하실생각이시면 예외가 생깁니다. send가 연속으로 호출되서

데이타가 올경우 하나로 묶여서 오기때문입니당..

역시 딴지였나요 ㅡㅡㅋ

' 형식이 내용을 규정한다. '

purewell의 이미지

Quote:
사이즈가 얼마가 오건 상관없이

스트림에 쌓아두었다가 처리가 가능합니다..

즉, ioctl로 나온 nRead 값은 버퍼에 잘 받아놓은 녀석이란 소리죠?

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.