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
[41492] Re:Re:Re:이상하게 문제 없을 소스가 문제 일으킵니다.
evergreen [heredity] 688 읽음    2005-08-17 12:41
안녕하세요. herediy입니다.

똑같은 결과가 나오며, 가독성에 별 문제가 없다면
    memset( sbuffer, 0x00, sizeof(sbuffer) );
    strncpy(sbuffer, data+offset, poslen);
보단
    if( poslen < sizeof(sbuffer) - 1 ) {
       strncpy(sbuffer, data+offset, poslen);
       sbuffer[poslen] = '\0';
    else {
       // 오류처리
    }
식의 코드를 추천하고 싶습니다. 그 이유는 아래 코드의 처리 비용이 훨씬 적기 때문입니다.
좀더 상황을 나쁘게 만들기 위해 sbuffer를
   char sbuffer[0x8000];
이라고 정의 했다면, 두 코드의 처리 속도 차이는 더 크게 벌어 졌을 겁니다(위 쪽 코드가 1번 처리할 때
아래 쪽 코드는 수 번 ~ 수 백번 처리 합니다). 특히 서버측 프로그램은 다수의 클라이언트가 접속되는
환경이므로 이러한 사항은 대단히 중요한 문제라 하겠습니다. 

그리고 문자길이를 클라이언트 측에서 maxsize로 제한했기 때문에 서버에서 검사하지 않아도 된다고 하셨는데,
이것도 한 번 짚고 넘어가야 합니다. ^^;
클라이언트에서 검사했다고 해도 데이터가 통신회선을 타고 서버에 도착했을 때,
클라이언트에서 보낸대로 도착하지 않는 경우도 있기 때문 입니다.
데이터가 올바로 도착했는지 검증하기 위해 CRC등의 추가 자료를 보내는 경우가 대부분이지만
CRC로 100% 오류를 검출해 내는 것이 아니기 때문에 서버가 클라이언트의 데이터를
여과없이 실행하는 것은 안정성에서 큰 문제를 가져올 수 있습니다. 특히 누군가가 Packet를
조작했고 그것을 악용하려 했다면 문제는 더 심각해 지겠죠.

현 시점에서 효율적인 방법을 적용할지 조금 비 효율인 방식을 적용할지의 여부는
개발 상황에 따라 달라질 수 있지만, 적용전에 이에 대한 평가정도는
있어야 하지 않을까 해서 주저리 주저리 몇 자 남겼습니다.

행복하세요.


☆~ 님이 쓰신 글 :
: 답변 감사합니다.
: 그 문제가 구조체의 체워졌던 데이터를 memset로 0으로 다 채워준 후 strncpy로 문자열을 복사하니 잘 되더군요.
: 정확하게 왜 그렇게 차이가 나게 되는진 말 모르겠으나 일단 해결은 보았습니다.
:
: 아. 그리고 들어오는 문자길이는 클라이언트 측에서 이미 다 maxsize로 체한 걸어두었기 때문에 그렇게 예외 처리까진 않해도 되겠더군요;;
:
: 아무튼 답변 감사합니다.

+ -

관련 글 리스트
41458 이상하게 문제 없을 소스가 문제 일으킵니다. ☆~ 765 2005/08/14
41462     Re:이상하게 문제 없을 소스가 문제 일으킵니다. evergreen 856 2005/08/14
41478         Re:Re:이상하게 문제 없을 소스가 문제 일으킵니다. ☆~ 732 2005/08/16
41492             Re:Re:Re:이상하게 문제 없을 소스가 문제 일으킵니다. evergreen 688 2005/08/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.