|
몇일동안 삽질하다가 결국은 도저히 이해가 가질 않습니다.
지금까지 별의별 방법을 다써도 여전히 쓰레기 값이 올라가는군요..
답답해서 프로그램을 통째로 올립니다.
다소 허접한 프로그램이지만 제가 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바이트를 보내는데 처음은 잘 들어가고 한번 더
돌아가면서 값을 보내버리는 현상이 발생합니다.
프로그램 짜면서 이렇게 복잡하게 얽힌 문제는 처음입니다.
질문이 다소 길어졌는데 많은 의견 부탁드립니다..
몇일동안 머리가 터지겠습니다....ㅠ.ㅠ
그럼 좋은 하루 되세요...
|