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
[59120] Re:Re:Re:소켓 프로그램인데요.. 머가 잘 못된걸까요..
아제나 [azena] 1439 읽음    2009-11-16 10:38
MTU는 편지 봉투라고 생각하시면 됩니다.
편지 봉투에는 넣을 수 있는 편지가 제한되어 있고 편지가 너무 길어서 2개나 3개로 봉투가 늘어나면 분실 위험이 그만큼 커지겠죠.

문제는 MTU 크기는 네트워크마다 틀립니다.
ADSL의 경우 576 옥텟의 MTU를 씁니다. 보통의 이더넷의 경우 1500 옥텟의 MTU인데, 1450 바이트 정도 밖에 못 보내는 이유는 IP/UDP 해더 때문입니다.

그래서 최적의 MTU 값을 찾는 알고리즘이 있습니다. 보통 ping 프로그램에 이런 기능이 있으므로 ping 소스를 몇개 분석하시면 답이 나올 것이라고 보고요.

소스 보니까 UDP를 써야 할 이유가 없는 것 같은데, TCP를 한번 생각해보시는 것도 좋을 것 같네요.

최적 MTU 크기 찾기도 귀찮고, UDP를 꼭 써야겠다면, 패킷 크기를 400 바이트 이내로 정해서 보내면 정말 특이한 네트워크가 아닌 이상에야 정상적으로 데이터 송수신이 이루어집니다.




아무리생각해도.. 님이 쓰신 글 :
: 그럼 이것을 해결할수 있는 방법은 머가 있을까요??
:
: nansama 님이 쓰신 글 :
: : MTU (Maximum transmission unit, the size of the largest packet that a network protocol can transmit)
: : 때문이지 않을까 생각 합니다.
: : 네트웍상에서 최고 큰 패킷의 길이가 보통은 Ethernet 에서 1500으로 설정 되어 있는데
: : 제어용 바이트가 추가 되므로 실제 최고 송수신 가능한 크기는 1500보다 몇바이트 작을겁니다.
: : 단, 이건 가장 큰 패킷의 사이즈를 정한것이지 반드시 상대방이 1400바이트를 보냈다고 해서 내가 1400 바이트를
: : 한번에 수신한다는 보장은 없습니다. 1400 보냈어도 LAN 상의 통신 환경에 따라 700+700 으로 두번 받아야
: : 할 경우도 있습니다.
: :
: : 아무리생각해도.. 님이 쓰신 글 :
: : : 서버와 클라인트 간에 통신을 하는 프로그램을 만드는데요..
: : :
: : : 1450바이트 이하를 한번에는 보내지고 왔다갔다 통신을 잘하는데요.
: : :
: : : 1500바이트는 왔다갔다 하지 못하네요..
: : :
: : : 이유가 먼지 해결좀 해주세요..ㅠ
: : :
: : : [/code] Client
: : :
: : : #define BUFSIZE 1455
: : : short Client(int argc, char **argv)
: : : {
: : : WSADATA wsaData;
: : : SOCKET hSocket;
: : : char message[BUFSIZE];
: : : char cancel[16];
: : : char cancel1[16];
: : : char message1[BUFSIZE],cDummyBuf[16];
: : : int iLen =0,nResult, iLen1 =0;
: : :
: : : SOCKADDR_IN dummyAddr;
: : : int dummyLength,buff_len;
: : : int addrLength;
: : : SOCKADDR_IN servAddr;
: : :
: : : if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
: : : ErrorHandling("WSAStartup() error!");
: : : return RTN_TRUE;
: : : }
: : :
: : : hSocket=socket(PF_INET, SOCK_DGRAM, 0);
: : : if(hSocket == INVALID_SOCKET){
: : : ErrorHandling("socket() error");
: : : return RTN_TRUE;
: : : }
: : :
: : : memset(&servAddr, 0, sizeof(servAddr));
: : : servAddr.sin_family=AF_INET;
: : :
: : : memset(cDummyBuf, CH_NULL,sizeof(cDummyBuf));
: : : ScreenAllSet(" *TCP/IP접속IP* ",
: : : CH_NULL,
: : : CH_NULL,
: : : " [.]SP = '.' ", TRUE);
: : :
: : : nResult = InputStyleNum(2, 0, (uchar *)". ",
: : : StrLen(15, (uchar*)cDummyBuf),
: : : 15, (uchar *)cDummyBuf, 30);
: : :
: : : if(nResult < RTN_FALSE)
: : : return RTN_TRUE;
: : :
: : : servAddr.sin_addr.s_addr=inet_addr((const char*)cDummyBuf);
: : : servAddr.sin_port=htons(atoi((char*)"9002"));
: : :
: : : memset(cancel1,CH_NULL,sizeof(cancel1));
: : : memset(cancel,CH_NULL,sizeof(cancel));
: : :
: : : ScreenAllSet((char*)"Client Test", CH_NULL, CH_NULL, CH_NULL, 1);
: : :
: : :
: : : while(1)
: : : {
: : : memset(message,CH_0,sizeof(message));
: : :
: : : addrLength = sizeof(servAddr);
: : : sendto(hSocket, message, strlen(message), 0, (SOCKADDR*)&servAddr, addrLength);
: : :
: : : dummyLength = sizeof(dummyAddr);
: : : buff_len = recvfrom(hSocket, message1, sizeof(message1), 0, (SOCKADDR*)&dummyAddr, &dummyLength);
: : :
: : : message1[buff_len]=0;
: : :
: : : if(memcmp(message, message1, sizeof(message1))){
: : : sprintf(cancel,"Cancel = %d",iLen);
: : : ScreenAllSet((char*)"Cancel", cancel, message, message1, 1);
: : : Wait(500, WAIT_TIMER);
: : : iLen++;
: : : continue;
: : : }
: : :
: : : if(!message1) {
: : : sprintf(cancel1,"NULL = %d",iLen1);
: : : ScreenAllSet((char*)"NULL", CH_NULL, cancel, cancel1, 1);
: : : Wait(500, WAIT_TIMER);
: : : iLen1++;
: : : continue;
: : : }
: : :
: : : if(KeyRead() == K_CANCEL){
: : : ScreenAllSet((char*)"Result", CH_NULL, cancel, cancel1, 1);
: : : WaitChar(0, WAIT_KEY | WAIT_TIMER, K_ENTER);
: : : return RTN_CANCEL;
: : : }
: : : }
: : :
: : : closesocket(hSocket);
: : : WSACleanup();
: : : return -1;
: : : }
: : :
: : : [code] server
: : :
: : : int Server(int argc, char **argv)
: : : {
: : : WSADATA wsaData;
: : : SOCKET hServSock;
: : : char message[BUFSIZE];
: : :
: : : int strLen;
: : :
: : : SOCKADDR_IN servAddr;
: : : SOCKADDR_IN clntAddr;
: : : int clntAddrSize;
: : :
: : : if(argc!=2){
: : : ErrorHandling("Port error!");
: : : }
: : :
: : :
: : : if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
: : : ErrorHandling("WSAStartup() error!");
: : :
: : :
: : : hServSock=socket(PF_INET, SOCK_DGRAM, 0);
: : : if(hServSock == INVALID_SOCKET)
: : : ErrorHandling("socket() error!");
: : :
: : :
: : : memset(&servAddr, 0, sizeof(servAddr));
: : : servAddr.sin_family=AF_INET;
: : : servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
: : : servAddr.sin_port=htons(atoi((char*)"9002"));
: : :
: : : if(bind(hServSock, (SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR)
: : : ErrorHandling("bind() error");
: : :
: : : ScreenAllSet((char*)"Server Test", CH_NULL, CH_NULL, CH_NULL, 1);
: : :
: : : while(1) {
: : : clntAddrSize=sizeof(clntAddr);
: : : strLen = recvfrom(hServSock, message, BUFSIZE, 0, (SOCKADDR*)&clntAddr, &clntAddrSize);
: : : message[strLen]=0;
: : : sendto(hServSock, message, strLen, 0, (SOCKADDR*)&clntAddr, sizeof(clntAddr));
: : :
: : : }
: : :
: : : closesocket(hServSock);
: : : WSACleanup();
: : : return -1;
: : : }
: : :
: : : void ErrorHandling(char *message)
: : : {
: : : ScreenAllSet((char*)"error", CH_NULL, message, CH_NULL, 1);
: : :
: : : exit(1);
: : : }

+ -

관련 글 리스트
59099 소켓 프로그램인데요.. 머가 잘 못된걸까요.. 아무리생각해도.. 1240 2009/11/13
59100     Re:소켓 프로그램인데요.. 머가 잘 못된걸까요.. nansama 1187 2009/11/13
59101         Re:Re:소켓 프로그램인데요.. 머가 잘 못된걸까요.. 아무리생각해도.. 1181 2009/11/13
59120             Re:Re:Re:소켓 프로그램인데요.. 머가 잘 못된걸까요.. 아제나 1439 2009/11/16
59102             Re:Re:Re:소켓 프로그램인데요.. 머가 잘 못된걸까요.. nansama 1167 2009/11/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.