|
송신과 수신부에서 데이터의 정합성을 위해 STX와 ETX를 데이터 앞 뒤에 붙여서 보내든지
전송되는 데이터의 Size를 미리 정해서 보내든지 해야합니다.
데이터의 양이 가변적일 경우 미리 데이터의 size를 앞에 보내고 뒤에 실제 데이터를 보내거나...
뭐 이런식으로 수신단에서 데이터의 시작과 끝을 명확하게 알수 있게 해주어여합니다.
그리고 수신부에서는 데이터의 마지막이 들어올때까지 버퍼에 저장을하고
완벽한 하나의 문장(데이터)이 완성된 후에 파싱하기위한 while 을 돌려야합니다.
데이터의 양이 매우 크다면 얘기가 다르지만 간략한 스트링 정도는 데이터를
마지막까지 수신할 때가지 기다리고 처리하는것이 좋습니다.
그리고 수신 버퍼는 데이터를 수신하기 전에 항상 초기화를 해줘야합니다.
중간에 임시로 사용되는 버퍼도 사용하기 전에 반듯이 초기화 해야하구요.
memset(buffer, NULL, sizeof(buffer));
쓰레기 데이터가 생기는 것은 초기화를 잘못한 경우가 많습니다.
버퍼의 크기도 간당간당하게 잡으면 안되구요 예상보다 크게 잡는게 좋습니다. (PC일 경우..)
소켓 통신 관련 서적을 하나 구입하시거나 강좌를 하나 선택해 보시는 것이
질답을 통하여 습득한 기술보다 좋습니다.(근본적인 원리를 파악해야합니다.)
수고하세요....
Nibble 님이 쓰신 글 :
: 스트링 토크나이져(strtok)가 대단한 일을 해 주는게 아닙니다.
: 결국 그녀석도 한 문자씩 처리하는 것이니까요.
: 잉잉잉잉이이이이이.. 라고 표현하신데서 느낌이 팍팍 오고 있습니다만...
: 말씀하신 문제는 한 문자씩 처리하는데서 오는게 아니라,
: 넘어온 문자열과 예전에 개행문자를 만나 처리하고 남은 문자열들에 대해 제대로 대처하지 못해
: 생기는 문제 같네요.
: 아울러, while 문 안의 조건이 다분 위험해 보입니다.
: 과연 최근에 받은 버퍼 안에 CR 이나 EOF 문자가 항상 있다는 보장이 있을까요?
:
: 김지은 님이 쓰신 글 :
: : C언어로 프로그램을짜고있습니다
: :
: :
: :
: : 소켓프로그래밍중입니다.
: :
: : 받은 문자열이 'message[BUF_SIZE]' 라는곳으로 들어옵니다
: :
: : 그런데 문자열이 한줄씩이 아닌
: :
: :
: :
: : 가나다라마바사
: :
: : abcdefghijklmn
: :
: : 잉잉잉잉이이이이이..
: :
: :
: :
: :
: :
: : 이런식으로 들어옵니다
: :
: : ㅠㅠ 이렇게 뭉텅이로 들어온 문자열을 줄단위로
: :
: : 한줄씩 잘라서
: :
: :
: :
: : <ㅋ>가나다라마바사
: :
: : <ㅋ>abcdefghijklmn
: :
: : <ㅋ>잉잉잉잉이이이이이..
: :
: :
: :
: : 이런식으로 앞에 문자를 넣어서 출력되게 (바로바로) 하고싶습니다
: :
: : ㅠㅠ
: :
: : 그런데
: :
: : 문자하나씩 받아서 나눠서 해보니 자꾸 이상하게 쓰레기값이들어가거나
: :
: : 문자열이 첫째줄만 들어오거나합니다
: :
: :
: :
: : 그 부분을 보여드리자면
: :
: :
: :
: : num=strlen(message);
: :
: : // buff[BUF_SIZE]=NULL;
: : i=0;
: : // for(i=0;i<num;i++)
: : // {
: : ch=message[j];
: : while(ch!='\r'&& ch!=EOF)
: : {
: :
: : ch=message[j];
: : buff[k]=ch;
: :
: :
: : // ch=message[j];
: : j++;k++;
: :
: : }
: : buff[k]='\0';
: :
: : strcpy(message1,buff);
: : // strcpy(message2,RismData.ServerName);
: : // strcat(message2,",");
: : // strcat(message2,message1);
: : // strcat(message3,message2);
: : strcat(message3,_message);
: :
: :
: : i=j; k=0;
: :
: :
: : // }*/
: :
: :
: :
: : 이렇게 한뒤
: :
: : message3 에
: :
: : 한줄씩 모은
: :
: : 예를 들면
: :
: :
: :
: : <ㅋ>가나다라마바사
: :
: : <ㅋ>abcdefghijklmn
: :
: : <ㅋ>잉잉잉잉이이이이이..
: :
: :
: :
: : 한줄씩 해서 저런모양이된것을 모읍니다
: :
: : 한뭉텅이씩 ㅜㅜ
: :
: : 그다음에 출력하려고합니다 .
: :
: : ㅠㅠ
: :
: : 방법이없을까요 ㅠ
: :
: : 저렇게 문자하나씩 받는방법말구요 휴
: :
: : strtok 쓰려고하는데 포인터로 어떻게 가르쳐야 할지 ㅠㅠ휴
|