[질문] tcp통신에서 한방에 무지하게 많은 data를 보내고 싶은데
글쓴이: andrea0705 / 작성시간: 목, 2003/04/10 - 7:58오후
안녕들 하세요.
tcp socket통신에서 batch로 어떤 DB table의 내용을
한방에 다른 곳으로 보낼려고 합니다.
근데 버퍼에 한계가 있어, 얼마가다가 끊기는데
이때는 어떻게 하나요?
.h 어딘가에 정의 되어 있을 버퍼size만 무지하게 늘려 주면 되나요?
아님 다른 방법을 서나요.
고수님들의 의견을 듣고 싶습니다.
Forums:
불가능으로 알고있습니다.
이더넷에서 보낼 수 있는 최대 바이트가 1500이라서 한번에 데이타가 날라가는건 무립니다.
tcp/ip에도 4096(size는 확실히 모르겠습니다. -_-)정도의 버퍼가 있기때문에 역시 한번에 못날리는걸로 알고있습니다.
tcp/ip는 커널 영역이라서 이걸 바꾸면 다른 프로세스에도 영향이 갑니다.
공부할때는 열심히 한다고하고... 다 제대로 아는줄 알았는데... 막상 답변할려니까 힘드네요 :oops:
어플리케이션 차원이라면 응용 프로그램의 버퍼사이즈를 크게 잡으시면 될듯합니다.
table 크기만한 구조체로 잡아서 보내거나...
MTU와 상관없습니다.
MTU와 상관없습니다. MTU 는 이더넷에서이지 그 위에서 작동하는 TCP세션의 최대통신할 수 있는 크기와는 다릅니다.
일반적으로 너무 크면 받는 측의 버퍼에도 문제가 있을 수 있습니다. 얼마만큼 주고 받는가에 따른 버퍼사이즈에 영향을 받기 때문입니다. 대개 32K이하에서 잡는 것이 좋다고 하더군요. 저도 32K이내에서 보통 짤라서 보냅니다.
========================================
* The truth will set you free.
보내는 측에서 연결된 상태로 짤라서 보낼려면 어떻게 해야 하나
보내는 측에서 연결된 상태로 짤라서 보낼려면 어떻게 해야 하나요?
DB에서 읽어다가 지금은 왕창 보내니 다 못가는데,,,
일정size만큼 보내고 다시 일정size만큼 보낼려면 tcp가 연결된 상태로 있어야
되지 않나요?
함 해보자.. 열심히..
db에서 갖고 온 내용을 루프를 돌면서 소켓에 원하시는 size만큼 wr
db에서 갖고 온 내용을 루프를 돌면서 소켓에 원하시는 size만큼 write해서 보내면 됩니다.
tcp는 원래 연결지향입니다.
원래 tcp는 연결지향 프로토콜이므로 보내고 나서 또 보내고 보내고 하면 됩니다. 그런데 보통 얼마만큼을 받을 것인지 모르기 때문에 "헤더 + 바디"의 형태로 많이 보내죠. 그래서 헤더엔 가장 최소한의 정보인 길이, 데이터의 남아있는지 여부(즉 마지막인지 아니면 계속 받아야 하는 데이터가 있는지)를 가지고 있는 것이죠.
이렇게 해서 특정 헤더를 읽고 다시 body를 정해진 길이만큼 읽다가 어느순간에 마지막 데이터면 읽고 세션을 종료하거나 유휴상태라든지... 하는 것이죠.
========================================
* The truth will set you free.
어짜피 버퍼크기만큼 보내는거 아닌가요?버퍼크기를 아주아주 크게 쓰시
어짜피 버퍼크기만큼 보내는거 아닌가요?
버퍼크기를 아주아주 크게 쓰시는 건지??
수신프로세스가 데이타를 읽을 시간을 주기위해
전송하는 놈이 usleep을 주세요.
백만은 1초 십만은 0.1초 5만은 0.05초
네트웍 상태에 따라 다름니다.
건당 5만 ~ 10만 정도 주면 적당할듯.
파일전송하려면 ftp 를 쓰세요.
ftp는 tcp/ip 기반의 application 입니다.
내 자식들도 나처럼 !!
제가 잘못이해했군요 ^^
한번에라는 뜻이 패킷 한방이라는 뜻으로 이해했네요. ^^;
서버와 클라이언트를 모두 짜시는거라면... 서버와 클라이언트 어플리케이션의 버퍼만 크게 잡아주면 문제없어 보입니다.
댓글 달기