[질문] tcp통신에서 한방에 무지하게 많은 data를 보내고 싶은데

andrea0705의 이미지

안녕들 하세요.

tcp socket통신에서 batch로 어떤 DB table의 내용을
한방에 다른 곳으로 보낼려고 합니다.

근데 버퍼에 한계가 있어, 얼마가다가 끊기는데
이때는 어떻게 하나요?

.h 어딘가에 정의 되어 있을 버퍼size만 무지하게 늘려 주면 되나요?
아님 다른 방법을 서나요.
고수님들의 의견을 듣고 싶습니다.

cjy1126의 이미지

이더넷에서 보낼 수 있는 최대 바이트가 1500이라서 한번에 데이타가 날라가는건 무립니다.

tcp/ip에도 4096(size는 확실히 모르겠습니다. -_-)정도의 버퍼가 있기때문에 역시 한번에 못날리는걸로 알고있습니다.

tcp/ip는 커널 영역이라서 이걸 바꾸면 다른 프로세스에도 영향이 갑니다.

공부할때는 열심히 한다고하고... 다 제대로 아는줄 알았는데... 막상 답변할려니까 힘드네요 :oops:

어플리케이션 차원이라면 응용 프로그램의 버퍼사이즈를 크게 잡으시면 될듯합니다.

table 크기만한 구조체로 잡아서 보내거나...

sunyzero의 이미지

MTU와 상관없습니다. MTU 는 이더넷에서이지 그 위에서 작동하는 TCP세션의 최대통신할 수 있는 크기와는 다릅니다.

일반적으로 너무 크면 받는 측의 버퍼에도 문제가 있을 수 있습니다. 얼마만큼 주고 받는가에 따른 버퍼사이즈에 영향을 받기 때문입니다. 대개 32K이하에서 잡는 것이 좋다고 하더군요. 저도 32K이내에서 보통 짤라서 보냅니다.

========================================
* The truth will set you free.

andrea0705의 이미지

보내는 측에서 연결된 상태로 짤라서 보낼려면 어떻게 해야 하나요?

DB에서 읽어다가 지금은 왕창 보내니 다 못가는데,,,
일정size만큼 보내고 다시 일정size만큼 보낼려면 tcp가 연결된 상태로 있어야
되지 않나요?

함 해보자.. 열심히..

morison의 이미지

db에서 갖고 온 내용을 루프를 돌면서 소켓에 원하시는 size만큼 write해서 보내면 됩니다.

sunyzero의 이미지

원래 tcp는 연결지향 프로토콜이므로 보내고 나서 또 보내고 보내고 하면 됩니다. 그런데 보통 얼마만큼을 받을 것인지 모르기 때문에 "헤더 + 바디"의 형태로 많이 보내죠. 그래서 헤더엔 가장 최소한의 정보인 길이, 데이터의 남아있는지 여부(즉 마지막인지 아니면 계속 받아야 하는 데이터가 있는지)를 가지고 있는 것이죠.

이렇게 해서 특정 헤더를 읽고 다시 body를 정해진 길이만큼 읽다가 어느순간에 마지막 데이터면 읽고 세션을 종료하거나 유휴상태라든지... 하는 것이죠.

========================================
* The truth will set you free.

xfmulder의 이미지

어짜피 버퍼크기만큼 보내는거 아닌가요?
버퍼크기를 아주아주 크게 쓰시는 건지??
수신프로세스가 데이타를 읽을 시간을 주기위해
전송하는 놈이 usleep을 주세요.
백만은 1초 십만은 0.1초 5만은 0.05초
네트웍 상태에 따라 다름니다.
건당 5만 ~ 10만 정도 주면 적당할듯.

while() {
      rsize = read(file_fd,buf,4096);
      wsize = write(sock_fd,buf, rsize) ;
      usleep(100000);
}

파일전송하려면 ftp 를 쓰세요.
ftp는 tcp/ip 기반의 application 입니다.

내 자식들도 나처럼 !!

cjy1126의 이미지

한번에라는 뜻이 패킷 한방이라는 뜻으로 이해했네요. ^^;

서버와 클라이언트를 모두 짜시는거라면... 서버와 클라이언트 어플리케이션의 버퍼만 크게 잡아주면 문제없어 보입니다.

댓글 달기

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