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
[75058] 소켓통신 send, recv...
TCP/IP [] 3644 읽음    2018-08-09 17:47
간단한 소켓통신을 만들고 있습니다
클라이언트쪽에서 문자열을 보내면 서버는 그대로 에코하는 방식이거든요
이게 서버랑 클라이언트 연결도 정상적으로 되고 클라이언트에서 send 반환값이 문자열 길이가 나오는거 보니 보내기도 정상인것 같은데 서버에서 recv로 나오는 반환값이 0인경우가 있어요
근데 웃긴게 이게 계속 이런게 아니라 간헐적으로 이런 현상이 있습니다...
처음에 프로그램 실행해서 첫 문자열 보냈을때 정상적으로 에코하면 계속 정상 작동합니다
근데 프로그램을 닫고 재실행 했을때 첫 에코가 안되면(recv반환이 0이면) 계속 0이 반환되네요
왜이러는지 알려주실 능력자님 도와주십쇼ㅠㅠㅠ

<서버>------------------------------------------------------------------------------------------
   int szClntAddr, strLen, fdNum, i;
   int recv_len = 0;
   int option, optlen;

   TIMEVAL timeout;
   fd_set reads, cpyReads;

   if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
   {
      ShowMessage("Server WSAStartup Error");
      return;
   }
   servSock = socket(PF_INET, SOCK_STREAM, 0);
   if(servSock == INVALID_SOCKET)
   {
      ShowMessage("Server Socket Error");
      return;                 
   }
   optlen = sizeof(option);
   option = true;
   setsockopt(servSock, SOL_SOCKET, SO_REUSEADDR, (char*)&option, optlen);

   memset(&servAddr, 0, sizeof(servAddr));
   servAddr.sin_family = AF_INET;
   servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
   servAddr.sin_port = htons(8000);

   if(bind(servSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
   {
      ShowMessage("Server Bind Error");
      return;
   }
   if(listen(servSock, 5) == SOCKET_ERROR)
   {
      ShowMessage("Server Listen Error");
      return;
   }

   FD_ZERO(&reads);
   FD_SET(servSock, &reads);

   while(1)
   {
      char temp_message[BUF_SIZE];
      char recv_message[BUF_SIZE];
      int temp, count = 0;

      cpyReads = reads;
      timeout.tv_sec = 3;
      timeout.tv_usec = 0;

      if((fdNum = select(0, &cpyReads, 0, 0, &timeout)) == -1)
         break;
      if(fdNum == 0)
         continue;

      for(i = 0 ; i < reads.fd_count ; i++)
      {
         if(FD_ISSET(reads.fd_array[i], &cpyReads))
         {
            if(reads.fd_array[i] == servSock)
            {
               szClntAddr = sizeof(clntAddr);
               clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &szClntAddr);
               if(clntSock == INVALID_SOCKET)
                  ShowMessage("Server Accept Error");
               FD_SET(clntSock, &reads);
               Panel_Message->Caption = "Connected Client....";
               Application->ProcessMessages();
            }
            else
            {
               while((strLen = recv(reads.fd_array[i], temp_message, strlen(temp_message), 0)) != 0)
               {
                  for(temp = 0 ; temp < strLen ; temp++)
                     recv_message[count++] = temp_message[temp];
                  send(clntSock, temp_message, strLen, 0);
                  recv_len += strLen;
               }
               recv_message[recv_len] = 0;
               if(recv_len != 0)
               {
                  Server_Memo->Lines->Add("메세지를 받았습니다. 메세지를 다시 전달 합니다.");
                  recv_len = 0;
               }
               if(strLen == 0)
               {
                  FD_CLR(reads.fd_array[i], &reads);
                  closesocket(cpyReads.fd_array[i]);
                  Panel_Message->Caption = "Closed Client....";
                  Application->ProcessMessages();
               }
            }
         }
      }
   }
   closesocket(servSock);
   WSACleanup();

   return;
}

<클라이언트>--------------------------------------------------------------------------------------
   AnsiString temp = Edit_DrawUp->Text;
   int str_len, recv_len, recv_cnt, i = 0;
   char * message;

   message = temp.c_str();
   Client_Memo->Lines->Add("Client>> " + AnsiString(message));

   if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
   {
      ShowMessage("Client WSAStartup Error");
      return;
   }
   clntSock = socket(PF_INET, SOCK_STREAM, 0);
   if(clntSock == INVALID_SOCKET)
   {
      ShowMessage("Client Socket Error");
      return;
   }

   memset(&servAddr, 0, sizeof(servAddr));
   servAddr.sin_family = AF_INET;
   servAddr.sin_addr.s_addr = inet_addr(addr);
   servAddr.sin_port = htons(8000);

   if(servAddr.sin_addr.s_addr == INADDR_NONE)
   {
      ShowMessage("INET_ADDR Error");
      return;
   }
   if(connect(clntSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
   {
      ShowMessage("Client Connect Error");
      return;
   }
   Panel_Message->Caption = "Connected Server....";
   Application->ProcessMessages();

  
      recv_len = 0, recv_cnt = 0;
      str_len = send(clntSock, message, strlen(message), 0);
    
      while(recv_len < str_len)
      {
         recv_cnt = recv(clntSock, message, str_len, 0);
         if(recv_len == -1)
         {
            Client_Memo->Lines->Add("Client>> 메세지가 전송되지 않았습니다.");
            break;
         }
         recv_len += recv_cnt;
      }
      message[str_len] = 0;
      if(str_len != 0 && recv_cnt != -1)
         Client_Memo->Lines->Add("Server>> " + AnsiString(message));

   Edit_DrawUp->Clear();
   closesocket(clntSock);
   WSACleanup();

+ -

관련 글 리스트
75058 소켓통신 send, recv... TCP/IP 3644 2018/08/09
75068     Re:소켓통신 send, recv... 라스코니 3061 2018/08/20
75065     Re:소켓통신 send, recv... 3072 2018/08/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.