C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[70056] Re:Re:Re:Re:IdTCPServer Socket Write 차이
박우성 [solgari] 3872 읽음    2013-08-28 16:13
Nagle알고리즘을 사용하느냐, 사용하지 않느냐에 따라 다릅니다.

TIdTCPServer나 TIdClient 의 멤버변수 UseNagle의 디폴트 값이 true로  되어 있어서 기본적으로 Nagle알고리즘을 사용하도록 되어 있습니다.

이런 경우에는 데이터를 조금씩 잘라서 보내도 실제로 데이타는 묶어져서 전송됩니다. ( Nagle알고리즘 )
이 경우에는 데이터를 잘라서 보내나 묶어서 보내나 실제로 별 차이가 없습니다.

하지만, UseNagle의 값을 false로 했을 때에서는 묶어서 보내는 편이 훨씬 속도 면에서 유리합니다.

그러나, 항상 Nagle알고리즘을 사용하는 것이 유리한 것은 아닙니다.  작은 크기의 자료를 주고 받는 경우에는 Nagle알고리즘을 사용하지 않는 것이 훨씬 더 응답성이 좋습니다.

주고 받는 자료의 구조(프로토콜)을 어떻게 설계하는냐에 따라서, Nagle 알고리즘의 사용여부를 결정해야 합니다.

그리고, TCP/IP 특성상 5바이트를 묶어서 한번에 보냈다고, 받는 쪽에서 5바이트가 한번에 도착 할 것이라고 생각하면 절대 안됩니다.

5바이트를 한번에 보내도, 받는 쪽에서 5바이트를 한 번에 받을 수도 있지만, 2바이트와 3바이트로 나누어 도착할 수도 있습니다.
이 부분에 대한 내용은  TCP/IP 관련 책이나 인터넷에서  관련 이론을 참고하시기 바랍니다.

이런 부분을 고려하여 데이터를 처리해 주면, 데이터를 나누어 보내나, 묶어서 보내나 아무런 문제가 발생하지 않습니다.


memi 님이 쓰신 글 :
: 헐 이해가 뽝! 오는데요 ㅋㅋㅋ
: 여튼 상대측에서 문제없이 잘 된다고하네요..
: UART랑 비슷하겠거니 하면서 소켓작업도 맨땅에 헤딩했더니 문제가 좀 있었네요 ㅎㅎ;
:
:
: 햄머 님이 쓰신 글 :
: : 맞습니다..
: :
: : 쉽게 이야기해서 10개의 야구공을 방망이로 한개식 팡!팡! 때릴때 소요된 시간과
: :
: : 야구공 10개를 꽁꽁 묶은 후에 한방에 때릴때 소요되는 시간이라 볼수 있나요?..
: :
: : 제가 적어 놓고도.. 헷갈.. ㅋㅋㅋㅋ
: :
: : civilian 님이 쓰신 글 :
: : : 심각한 속도저하가 따라옵니다.
: : :
: : : memi 님이 쓰신 글 :
: : : : 소켓라이트할때 한바이트씩 보내는 것과 버퍼로 보낼때 차이가 있을까요?
: : : : 제가 짠 클라이언트에서는 둘다 잘 처리가되는데..
: : : : 한바이트씩 보내는 걸로 모뎀에서 테스트중인데
: : : : 상대측 모뎀에서 한바이트 받은 후 나머지 4개가 들어온다고 하는데요..
: : : : 소켓라이트 한바이트 전송할 때마다 눈에 안보이는 뭔가 다른 액션이 있나요?
: : : : 버퍼로 보내는 것으로 상대편에 보내긴 했습니다만..
: : : :
: : : :
: : : : 
: : : : unsigned char sdata[5] = {'1','2','3','4','5'};
: : : : #if 0 //버퍼로 보낼때
: : : :        TByteDynArray buff;
: : : : 	buff.Length = 5;
: : : : 	memcpy(&buff[0], &sdata, buff.Length);
: : : : 	if(con->Connected())
: : : : 		con->Socket->Write(buff);
: : : : #else //한바이트씩 보낼때
: : : : 	for(int i = 0; i < 5; i++)
: : : : 		if(con->Connected())
: : : : 			con->Socket->Write(sdata[i]);
: : : : #endif
: : : : 
: : : : 

+ -

관련 글 리스트
70052 IdTCPServer Socket Write 차이 memi 3311 2013/08/28
70053     Re:IdTCPServer Socket Write 차이 civilian 16135 2013/08/28
70054         Re:Re:IdTCPServer Socket Write 차이 햄머 7697 2013/08/28
70055             Re:Re:Re:IdTCPServer Socket Write 차이 memi 4180 2013/08/28
70056                 Re:Re:Re:Re:IdTCPServer Socket Write 차이 박우성 3872 2013/08/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.