|
SleepEx()를 해보니 쓰레드 동기/비동기 문제는 아닌것 같습니다.
아무래도 배열이나 Buffer Read 문제인거 같은데요..
정확히 원인을 규명하기가 힘드네요..^^
혹시나 다른 의견 있으시면 알려주세요...^^
마술감자 님이 쓰신 글 :
: 배열인 경우에 new던 아니던 상관이 없는것은 분명합니다.
: 정확히 어느 부분을 봐야 할지 몰라서 소스를 대충 훑어 봤는데..
:
: AThread-> 같은것이 눈에 띄네요.
: 저게 쓰레드로 작동되거나, 내부적으로 비동기 소켓인 경우
: 이하의 버퍼에 접근하는 코드는 제대로 작동하지 않습니다.
:
: 아래 코드가 제대로 작동하지 않으면서 쓰레드로 넘어간 320이라는 값이 변형됐을수도 있구요.
: 어디까지나 추측이지만 그쪽이 완벽히 되는지도 검토해 보시면 좋겠네요.
:
: 받는 부분과 파싱하는 부분 사이에 SleepEx()를 3초 정도 돌린다음 해보시고 잘 되면
: 쓰레드/비동기 문제입니다.
:
:
: 다꾸엔젤 님이 쓰신 글 :
: : 몇일동안 삽질하다가 결국은 도저히 이해가 가질 않습니다.
: :
: : 지금까지 별의별 방법을 다써도 여전히 쓰레기 값이 올라가는군요..
: :
: : 답답해서 프로그램을 통째로 올립니다.
: :
: : 다소 허접한 프로그램이지만 제가 BC++을 입문한지 얼마되지 않아서..^^
: :
: : 일단 프로그램의 개요는 이렇습니다.
: :
: : 소켓통신으로 320바이트 만큼 읽어옵니다.
: :
: : 읽어오는 값은
: :
: : "95 0111241111 "
: :
: : 이러한 값을 클라이언트에서 읽어옵니다.
: :
: : 320바이트지요...
: :
: : 일단 공백부분은 NULL값이 아닌 공백값(" ") 입니다.
: :
: : 읽어온 값중에서 0111231111이라는 값을 뽑아서 데이터 베이스에서 "#"을 토큰으로 하는 값을 뽑아옵니다.
: :
: : 0111231111#ABC#37.529167#126.871944#20041123133102#123456#가나다라마 바사 아자차카타
: :
: : 데이터베이스에서 읽어오는 값은 위와 같습니다.
: :
: : 위의 값을 strtok()로 짤라서 해당 배열에 넣으면
: :
: : strcpy(baBill, "96");
: : strcat(baBill, "00");
: : strcat(baBill, btyrespMsg);
: : strcat(baBill, btyTelnum);
: : strcat(baBill, btyXpos);
: : strcat(baBill, btyYpos);
: : strcat(baBill, btyZipcode);
: : strcat(baBill, btyAddr);
: : strcat(baBill, btyPoiinfo);
: : strcat(baBill, btyFiller);
: :
: : 이 구문의 btyAddr 값에서 자꾸 쓰레기 값이 흘러 들어가는군요...
: :
: : 이러한 현상이 나타나는 원인과 해결 방안을 알고 싶습니다.
: :
: : 두번째로 분명히 배열값을 주었는데도 불구하고 320바이트의 값이 초과해 버려도 322바이트라던지 330바이트의
: :
: : 초과된 값이 배열에 들어가는 현상이 발생합니다.
: :
: : 제가 배열을
: :
: : byte baBill[320];
: : byte btyZipcode[6];
: : byte btyrespMsg[80];
: : byte btyTelnum[20];
: : byte btyXpos[10];
: : byte btyYpos[10];
: : byte btyAddr[80];
: : byte btyPoiinfo[80];
: : byte btyFiller[30];
: :
: : 이런식으로도 초기화 시켜 보았고
: :
: : byte *baBill= new char[320];
: : byte *btyZipcode = new char[6];
: : byte *btyrespMsg = new char[80];
: : byte *btyTelnum = new char[20];
: : byte *btyXpos = new char[10];
: : byte *btyYpos = new char[10];
: : byte *btyAddr = new char[80] ;
: : byte *btyPoiinfo = new char[80];
: : byte *btyFiller = new char[30];
: :
: : 위와 같은 방법으로도 초기화 시켜 보았습니다.
: :
: : 또한 byte가 아닌 char 형으로도 두방법 다 사용해 보았지만 별 효과가 없었습니다.
: :
: : 사정이 이렇다 보니 마지막에 return값을 받고 클라이언트에 write하면 값이 몇번 전송되다가 멈추어 버립니다.
: :
: : 디버깅해보니 read하고 해당 리턴값이 320바이트를 초과해 버리니 320바이트를 보내는데 처음은 잘 들어가고 한번 더
: :
: : 돌아가면서 값을 보내버리는 현상이 발생합니다.
: :
: : 프로그램 짜면서 이렇게 복잡하게 얽힌 문제는 처음입니다.
: :
: : 질문이 다소 길어졌는데 많은 의견 부탁드립니다..
: :
: : 몇일동안 머리가 터지겠습니다....ㅠ.ㅠ
: :
: : 그럼 좋은 하루 되세요...
|