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
[71356] 소켓 패킷 crc값이 춤을 춥니다..
locke [syiware] 3361 읽음    2014-05-23 18:20
안녕하세요. 요새 소켓서버 프로그램을 xe5에서 indy IdTCPServer 컴포넌트로 개발중입니다.

클라이언트와 패킷을 주고받는데 클라이언트가 패킷을 줄 때는 패킷 끝에 2바이트의 crc값이 있거든요.

이걸 서버단의 crc구하는 루틴으로 crc값을 구해서 맞으면 정상적인 패킷처리를 하고 아니면 오류로 로그에 남깁니다.

동접이 550명 까지는 아무 문제가 없습니다. 근데 600 이상이 되면 20 패킷중 8개는 crc가 다르게 나옵니다.

1천명이 신호를 주고받을때 수동으로 서버 창에다가 데이터 패킷 만들어서 crc값 호출해보면

어떤 놈은 매번 호출해도 같은 값이 나오고 어떤 놈은 값이 자주 바뀌네요.

물론 동접이 0명일 경우는 고정값으로 매번 호출해도 불변입니다.

이걸 비교해서 처리하는 루틴은 OnExecute() e/h에 있고 여기서 crc값 구해서 리턴해주는 함수 하나 호출하거든요.

그 함수는 자동변수 몇개 스택에 잡아놓고 crc값을 구하기 위해 매핑된 전역 unsigned short형 배열 256개를 참조합니다.

물론 거기선 각 패킷의 문자값을 루프 돌려서 비트연산을 하고 매핑된 배열에서 가져온 값으로 xor 연산도 합니다.

OnExecute는 Indy가 접속한 클라이언트별로 쓰레드 만들어서 루핑돌다가 호출하는 call back 함수잖아요?

혹시나 동접하는 애들이 서로 충돌하는게 아닌가 해서 CriticalSection을 써봐도.. 증상은 동일하네요.

crc 함수를 호출해도 각 개별스택에 자동변수들 들어가니까 중복되어 충돌날 부분도 안보이는데

왜 이러한 현상이 생기는걸까요? 이렇게 많은 동접을 처리해본 경험이 없네요.

혹시 이런 경험 있으신 분은 주저마시고 뭐든 도움될 만한 힌트를 주세요.

부탁드립니다.

-locke

+ -

관련 글 리스트
71356 소켓 패킷 crc값이 춤을 춥니다.. locke 3361 2014/05/23
71359     자답:소켓 패킷 crc값이 춤을 춥니다.. locke 3282 2014/05/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.