WIZnet Developer Forum

Tcp 서버에서 데이터 받을때

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 이 함수에서 처리를 하는거 같은데(정확히 맞는지 모르겠습니다^^;)

혹시 어떻게 해야 될지 알수 있을까요?
(혹시 함수에 대한 설명 되어 있는 문서가 있는지도 궁금합니다)

펌웨어를 잘 못하다 보니 이렇게 복잡한 소스는 따라가기가 쉽지 않네요

항상 도움주셔서 감사합니다^^

안녕하세요. Wiznet의 Peter입니다.

목적이 명확하지 않아 정확하게 말씀드릴수는 없으나 단순히 데이터를 계속 축적하시려면 별도의 memory buffer를 두셔야 합니다.

Queue 등을 사용하셔서 내용을 쌓이게 하고 그 데이터를 다시 SD CARD 등에 저장하는 방법이 좋을 듯 싶습니다.

임베디드 시스템의 특성상 메모리에 한계가 있으니까요.

정말 단순히 한개의 메모리 변수에 데이터를 누적시킬수는 있으나 절대 추천드리고 싶지 않습니다.

데이터를 읽어오실 때 단순히 이전에 받은 데이터 사이즈 만큼 메모리 변수의 포인터에 더해서 읽어오시면 됩니다.

-_-;;; 설명이 이상한가요? 하하;;;;

예를 들면 이런거죠.

recv(sn, buf+이전에 받은 데이터 사이즈, size-이전에 받은 데이터 사이즈);

도움이 되셨으려나 모르겠네요.

수고하세요 ^^

답변 감사합니다

버퍼에 데이터를 넣을려고 하는이유가

원형 큐로 들어온 데이터를 저장하고 데이터가 있을시 바로 큐에서 데이터를 빼내서 처리를 할려고 합니다

그냥 받을 경우 받자마자 데이터 처리를 다하지 못했는데 또 데이터가 들어오면 기존 데이터가 다 날아가 버리니깐요

다른 버퍼에 복사를 하고 데이터를 처리 한다고 해도 순간적인 데이터 처리시간이 늦어버리면

데이터를 잃어버리지 않을까 해서요

감사합니다

해보고 안되면 염치 불구 하고 또 질문하러 오겠습니다^^

네 맞습니다.

큐에 넣었다가 처리하시는 방법이 가장 좋습니다.

데이터 로스나 처리 미스를 최소화시킬 수 있겠죠.

화이팅 하세요~ ^^

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.