sinwho
1
TCP 서버로 만들고
loopback_tcps 함수로
데이터 들어오면 바로 다시 보내는 에코 서버는 테스트 했습니다
근데 저는 들어오는 데이터를 버퍼에 쌓았다가 처리 할려고 하는데 잘안되네요
일단 loopback_tcps 함수의
while(size != sentsize)
{
ret = send(sn,buf+sentsize,size-sentsize);
if(ret < 0)
{
close(sn);
return ret;
}
sentsize += ret; // Don’t care SOCKERR_BUSY, because it is zero.
}
구문을 없애서 받은 데이터 돌려보내는건 없앴습니다
받은 데이터를 그대로 출력해보니
만약 처음에 10바이트가 들어오면 버퍼에 저장되더라고요
if((ret = loopback_tcps(SOCK_TCPS0, gDATABUF, 5000)) < 0)
{
printf(“SOCKET ERROR : %ld\r\n”, ret);
}
위에처럼 처리 했습니다
근데 다시 데이터를 받으면 앞의 데이터는 사라지고 다시 들어온 데이터만 버퍼에 남아있던데
계속 쌓이게 할순없을까요?
소스를 따라따라 따라 가다 보니
WIZCHIP_READ_BUF 이 함수에서 처리를 하는거 같은데(정확히 맞는지 모르겠습니다^^;)
혹시 어떻게 해야 될지 알수 있을까요?
(혹시 함수에 대한 설명 되어 있는 문서가 있는지도 궁금합니다)
펌웨어를 잘 못하다 보니 이렇게 복잡한 소스는 따라가기가 쉽지 않네요
항상 도움주셔서 감사합니다^^
bangbh
2
안녕하세요. Wiznet의 Peter입니다.
목적이 명확하지 않아 정확하게 말씀드릴수는 없으나 단순히 데이터를 계속 축적하시려면 별도의 memory buffer를 두셔야 합니다.
Queue 등을 사용하셔서 내용을 쌓이게 하고 그 데이터를 다시 SD CARD 등에 저장하는 방법이 좋을 듯 싶습니다.
임베디드 시스템의 특성상 메모리에 한계가 있으니까요.
정말 단순히 한개의 메모리 변수에 데이터를 누적시킬수는 있으나 절대 추천드리고 싶지 않습니다.
데이터를 읽어오실 때 단순히 이전에 받은 데이터 사이즈 만큼 메모리 변수의 포인터에 더해서 읽어오시면 됩니다.
-_-;;; 설명이 이상한가요? 하하;;;;
예를 들면 이런거죠.
recv(sn, buf+이전에 받은 데이터 사이즈, size-이전에 받은 데이터 사이즈);
도움이 되셨으려나 모르겠네요.
수고하세요 ^^
sinwho
3
답변 감사합니다
버퍼에 데이터를 넣을려고 하는이유가
원형 큐로 들어온 데이터를 저장하고 데이터가 있을시 바로 큐에서 데이터를 빼내서 처리를 할려고 합니다
그냥 받을 경우 받자마자 데이터 처리를 다하지 못했는데 또 데이터가 들어오면 기존 데이터가 다 날아가 버리니깐요
다른 버퍼에 복사를 하고 데이터를 처리 한다고 해도 순간적인 데이터 처리시간이 늦어버리면
데이터를 잃어버리지 않을까 해서요
감사합니다
해보고 안되면 염치 불구 하고 또 질문하러 오겠습니다^^
bangbh
4
네 맞습니다.
큐에 넣었다가 처리하시는 방법이 가장 좋습니다.
데이터 로스나 처리 미스를 최소화시킬 수 있겠죠.
화이팅 하세요~ ^^