UDP에서 buffer size

stoneshim의 이미지

server 프로그램에서

    if( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )
    {
        perror("socket error ");
        exit(0);
    }
...
    if( (bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0 )
    {
        perror("bind error ");
        exit(0);
    }
...
    sleep(10);
    while(i=0;;i++)
    {
        n = recvfrom(sockfd, (void *)buf, sizeof(buf), 0,
                (struct sockaddr *)&clientaddr, &clilen);
        printf("i=[%d]\n", i);
    }
    close(sockfd);

이러한 방식으로 소켓을 열고 bind, 10초 후에 recvfrom을 시작합니다.
이때의
/proc/sys/net/core/rmem_max
/proc/sys/net/core/rmem_default
값은 모두 65535 입니다.

클라이언트가 서버가 시작되고 10초 이내에
65536 -1 - 20(ip header) -8(udp header) byte만큼의 버퍼를 sendto 하면(사실은 더 보낼수도 없더군요. 이게 현재 설정에서 보낼 수 있는 최대값입니다)
서버의 소켓 버퍼에 저장이 되고 서버가 recvfrom을 호출하면 잘 읽습니다.

클라이언트가
(65536/2 -1 -20 -8 ) byte만큼의 버퍼를 두번 sendto 하면 서버의 소켓 버퍼에 첫번째 send한 내용만 저장되고 두번째 보낸 데이터는 저장되지 않습니다.
혹시나 해서 보내는 값을 줄여봤는데... (65536/2 -1 -20 -8 -446) 크기를 보내면 (이값이 한계값입니다) 두번째 보낸 데이터까지 저장이 됩니다.

테스트 시에 클라이언트의 버퍼 크기와 서버의 버퍼크기는 동일하게 했습니다.

socket buffer 에 udp diagram이 저장될 때 ip header 나 udp header까지 저장이 되나요? - 제 생각에는 udp data만 저장이 될것 같은데 -
또 ip header 와 udp header까지 같이 저장이 된다고 해도 계산상으로 두번째 보낸 데이터까지 저장이 될 수 있어야 할것 같은데.. 왜 이런 현상이 일어나는지 알 수가 없군요.

도움 부탁드립니다.

[환경]
$ uname -a
Linux xxx 2.4.18 #7 SMP Wed Feb 19 15:44:28 KST 2003 i686 unknown

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.