/* udp_serv.c: Support echo server for UDP port 10000. Compiler: BC++ 3.1, Turbo C++ 1.01 (3.01) Compile mode: Large Project: Client.c ..\lib\upac5000.Lib ..\lib\tcp_dm32.lib ..\lib\FW_nnnnn.LIB Hardware: uPAC-5000 [Apr 18, 2014] by Liam */ #include #include #include "..\lib\7186E.h" #include "..\lib\Tcpip32.h" #include "..\lib\MFW.h" #define BUFSIZE 1460 /* read/write buffer size */ void DoUdp10K(int skt); UDP_SOCKET Udp10K={ -1, // int socket; 10000, // unsigned MyPort; NULL, // char *RemoteIp; 0, // unsigned RemotePort; 1, // int fNonBlock; 1, // int fEnableBroadcast; 0, // int status; DoUdp10K // void (*CallBackFun)(int skt); }; unsigned char myIp[4]; void ShowIp(void) { static int idx=0; int data; data=myIp[idx++]; Show5DigitLedWithDot(1, idx); Show5DigitLed(5, data%10); data/=10; if(data) { Show5DigitLed(4, data%10); data/=10; if(data) Show5DigitLed(3, data); else Show5DigitLed(3, 16); } else { Show5DigitLed(4, 16); Show5DigitLed(3, 16); } Show5DigitLed(2, 16); if(idx>=4) idx=0; } char *GetModuleName(void) /* User's program must support this function for UDP search */ { return "uPAC-5000"; } char *GetAliasName(void) /* User's program must support this function for UDP search */ { return "test1" ; } void XS_UserInit(int argc,char *argv[]) { extern int bAcceptBroadcast; extern unsigned long ACKDELAY; extern long MAXTXTOUT; void UserLoop(void); InitLib(); bAcceptBroadcast=0; ACKDELAY=200; GetIp(myIp); Print("IP=%d.%d.%d.%d\n", myIp[0], myIp[1], myIp[2], myIp[3]); XS_AddSystemLoopFun(UserLoop); /* Add UDP search function */ XS_AddUdpSocket(&XS_UdpSearch); bAcceptBroadcast=1; /* allow to receive the UDP broadcast */ /* Add UDP telnet client */ XS_AddUdpSocket(&Udp10K); XS_AddSystemLoopFun(XS_SocketLoopFun); XS_StartSocket(); EnableWDT(); MAXTXTOUT=6000UL; } void XS_UserEnd(void) { XS_StopSocket(); DisableWDT(); } void UserLoop(void) { static unsigned long LedTime=0; unsigned long curTimeticks; RefreshWDT(); if(Kbhit()) { switch(Getch()) { case 27: QuitMain=1; /* press "Esc" key to quit */ break; default: break; } } if((curTimeticks=GetTimeTicks())-LedTime>=500UL) { LedTime=curTimeticks; LedToggle(); ShowIp(); } } char buf[BUFSIZE]; extern int errno; void DoUdp10K(int skt) { struct sockaddr_in sockAddrWhoSent; int i, len; len=recvfrom(skt, buf, BUFSIZE, 0, (struct sockaddr *) &sockAddrWhoSent, &i); if(len>0) { buf[len]=0; Print("%s\n", buf); /* here just echo back the received message */ i=sendto(skt, buf, len, 0, (struct sockaddr *) &sockAddrWhoSent, sizeof(sockAddrWhoSent)); if(i<0) { /* do nothing - no retry mechanism */ Print("sendto failed A: err %d(errno=%d)\n", i, errno); } } else { Print("Udp read error:%d(srrno=%d)\n", len, errno); } } void main(int argc, char *argv[]) { XS_main(argc, argv); /* call the XS library main function. */ }