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
[41584] Re:Re:Re:윈속 소켓통신에서 초보적인 질문..
evergreen [heredity] 970 읽음    2005-08-22 11:52
이성제 님의 방법은 Packet을 잃어 버릴 수 있다고 판단됩니다.
Sender가 "자기가지정한프로토콜"을 한번에 전송해도
Receiver가 받을 때는 TCP의 특성상  "자기가지정한프로토콜"가 한번에 읽혀 진다고
보장 할 수 없기 때문입니다. ^^;
-heredity-

이성제 님이 쓰신 글 :
: 원래 그렇게 쓰나요?? Cuperido.. 프로그램 잘 짜시니까 맞겠죠??
: 신인도는 있습니다 ㅎ
: 저는 그렇게 안쓰구요''; 개인적으로 프로토콜을 지정해서 사용 하는데요
:
: read 부분에
:
: AnsiString Text = Socket->ReceiveText;
:
: if(Text.Pos("자기가지정한프로토콜"))
: {
:        여기서 해야 할 작업들을 해야 겠죠.
: }
:
: else if (Text.Pos("자기가지정한 다른 프로토콜"))
: {
:        여기서도 다른 작업을 처리 해야겠죠.
: }
:
: 이런식으로 짰는데'';
: 이것도 별 문제 없이 잘 되더군요 ㅎ
:
:
:
: 유영인  Cuperido 님이 쓰신 글 :
: : if(받은 데이터가 있으면)
: :
: : 이 처리를 어떻게 해주셨냐에 따라서 결과가 틀려질 수 있을것 같네요.
: :
: : 아마도, select 를 이용해서 전부 다 긁어보신다음 마지막
: : 연결 핸들로 데이터 여부를 판단하시지 않았나 싶습니다.. :D
: :
: : 보통은.. 아래와 같이 움직입니다.
: :
: :  fd_set                 fdSockCheck;
: :  int                    itCount, itTemp, itReadBytes, itAddressLength, itPlayer;
: :  static struct timeval  ssTime = {0L, 5000L};
: :  struct sockaddr_in     siAddress;
: :  char                   caQueue[QUEUESIZE + 1];
: :
: :
: :  // UDP 처리 때문에 Read 딜레이를 두지 않음
: :  ssTime.tv_usec  = 5000L;
: :  itAddressLength = sizeof(siAddress);
: :  fdSockCheck     = fdSockets;
: :
: :  if(select(TABLESIZE, &fdSockCheck, 0, 0, &ssTime) > 0) {
: :    itReadBytes = recvfrom(UDPSocket, BUFFER, IBUFSIZE, 0, (struct sockaddr*)&siAddress, &itAddressLength);
: :
: :    if(itReadBytes >= 1) {
: :      ... 읽기 처리 루틴 ...
: :    }
: :  }
: :
: :  return(0);
: :
: :
: :
: : 박기홍 님이 쓰신 글 :
: : : 또 이런 초보적인 질문을 합니다..
: : : 이해가 안가는 부분이 있어서 인데요..
: : :
: : : 아주 간단하게 c/s 프로그램을 만들었습니다.
: : : 쓰레드를 이용해서 여러명이 접속도 가능하게 했구요..
: : :
: : : 제가 궁금한것은.. 서버에서
: : :
: : : accpet 부분을 쓰레드 안에서 시행하게 했습니다.
: : : 그리고 accept에 성공하면
: : : 또 다른 쓰레드로 recv()를 돌려서 클라이언트에게
: : : 받은 메시지가 있으면 메시지 박스를 띄었구요..
: : : 아래를 보시면 이해가 더 빠르실거에요..
: : :
: : : [[ thread1 ]]
: : : for(;;) {
: : :      if( accept성공 )
: : :      {
: : :           MessageBox(접속성공);
: : :           thread2 호출;
: : :      }
: : : }
: : :
: : : [[ thread2 ]]
: : : for(;;) {
: : :      if( 받은데이터가 있으면)
: : :      {
: : :           MessageBox(받은데이터 출력);
: : :      }
: : : }
: : :
: : :
: : : 이런 식으로 했는데..
: : : 클라이언트 프로그램을 여러개 띄어놓고 테스트를 해보면..
: : : 클라이언트들이 접속할때마다 서버에서는 "접속성공"이라는 메시지를 보여줍니다.
: : :
: : : 하지만 클라이언트의 (테스트용으로 만든) 메시지를 보내기 버튼을 누르면
: : : 마지막에 접속에 성공한 클라이언트의 메시지만 뿌려주고요..
: : : 그 전에 접속해있던 클라이언트의 메시지보내기버튼을 누르면 아무 반응도 안하더군요..
: : :
: : :
: : : 제가 생각할때는 이런식으로 하면 당연히 될줄 알았는데.. -_-;;
: : : 항상 도움만  받아서 죄송합니다~
: : :
: : : 방법에 문제가 있다거나 하는 부분을 가르쳐주시면 감사하겠습니다. ^^

+ -

관련 글 리스트
41436 윈속 소켓통신에서 초보적인 질문.. 박기홍 893 2005/08/11
41466     Re:윈속 소켓통신에서 초보적인 질문.. 유영인 Cuperido 982 2005/08/14
41580         Re:Re:윈속 소켓통신에서 초보적인 질문.. 이성제 924 2005/08/22
41584             Re:Re:Re:윈속 소켓통신에서 초보적인 질문.. evergreen 970 2005/08/22
41581             Re:Re:Re:윈속 소켓통신에서 초보적인 질문.. 유영인 Cuperido 1086 2005/08/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.