u16 netRecv( u8 socket, u8 * buf, u16 len)
socket : 소켓번호 (0 부터 3 사이 값) |
buf :수신한 데이터를 저장할 곳의 포인터 |
len : 수신할 데이터의 바이트수 |
이더넷 데이터 수신 함수입니다. netStatus 함수로 읽어본 상태가 SOCK_ESTABLISHED 일 경우에만 사용할 수 있습니다.
수신할 데이터의 개수를 적어주어야 하므로, 본 함수를 사용하기 전에 수신버퍼에 데이터가 도착해 있는지를 살펴보아야 합니다. 이를 위한 netRxLen 함수가 준비되어 있습니다.
성공하면 수신한데이터의 개수를 반환하고, 실패하면 –1 (0xffff)을 반환합니다.
다음은 TCP 루프백 테스트 프로그램입니다. 아래그림처럼 네트워크상에 TCP 에코처리를 해주는 별도의 디바이스가 있어야 테스트가 가능합니다.
이 프로그램은 에코디바이스로 TCP 데이터를 송신하고, 같은 데이터가 되돌아 오는지를 확인하여, LCD 상에 표시해주는 프로그램입니다. 에코디바이스의 IP 어드레스는 192.168.0.1 로 되어 있습니다.
#include "moacon500.h" void cmain(void) { u8 i=0x35,j; u16 k,kk=0,length1; clcdPower(1); clcdI2cInit(0); u8 GatewayIP[]={192,168,0,1}; u8 SubnetMask[]={255,255,255,0}; u8 MacAdr[]={0,0,34,53,12,0}; u8 DeviceIp[]={192,168,0,12}; u8 destIP[]={192,168,0,2}; char data1[] = "Comfile"; char data2[20]; netBegin(GatewayIP, SubnetMask, MacAdr, DeviceIp); socketOpen(0,1000); connect(0,destIP,5000); while (1) { switch(netStatus(0)) { case SOCK_ESTABLISHED: netPrint(0,"Comfile%D%C",kk++,0); delay(20); length1 = netRxLen(0); clcdLocate(0,2); netRecv(0,data2,length1); data2[--length1]=0; clcdPrint(0,2,data2); clcdPrint(0,3,"Rx=%d",length1); delay(200); break; case SOCK_CLOSE_WAIT: disConnect(0); clcdPrint(0,0,"Socket disconnect"); delay(200); break; case SOCK_CLOSED: clcdPrint(0,0,"Socket Closed "); delay(200); if (connect(0,destIP,5000) != 0 ) { clcdPrint(0,0,"Socket open "); } break; } } }