Keil Logo

Technical Support

On-Line Manuals

RL-ARM User's Guide (MDK v4)

RL-RTX RL-FlashFS RL-TCPnet TCP Socket Opening TCP Connection TCP Active Open TCP Passive Open Sending TCP Data Example for Sending Data Multiple TCP Connections UDP Socket Opening UDP Connection Sending UDP Data When DHCP Enabled When ARP Cache Empty Example for Sending Data IP Multicasting Multiple UDP Connections Configuring RL-TCPnet Static Configuration System Definitions Ethernet Network Interface PPP Network Interface SLIP Network Interface UDP Socket TCP Socket BSD Socket HTTP Server Telnet Server TFTP Server TFTP Client FTP Server FTP Client DNS Client SMTP Client SNMP Agent SNTP Client Error Function Runtime Configuration Library Files Using RL-TCPnet Stand Alone With RTX Kernel Event Driven Operation IP Address Assignment Ethernet Interface PPP Interface SLIP Interface Localhost Applications HTTP Server Script Language CGI Functions Ajax Support Using XML XML Example How it works SOAP Support SOAP Interface Large POST Messages Web Pages Default Page Error Pages Web on SD Card Web Update File System Interface Http Caching How it works Internal Web External Web Multi-user Authentication Using RAM File System FCARM File Converter PRINT Directive NOPRINT Directive PAGEWIDTH Directive PAGELENGTH Directive ROOT Directive Telnet Server Command Line Interface Multi-user Authentication Sending Reply Message Short Reply Long Reply Continuous Screen Update TFTP Server File System Interface TFTP Client File System Interface FTP Server File System Interface Multi-user Authentication Supported Commands FTP Client File System Interface SMTP Client SNMP Agent MIB Database MIB Interface MIB Entry MIB Table DNS Resolver Starting DNS Device Drivers Ethernet Driver Interrupt Mode Modem Driver Serial Driver Using Serial Link Cable Connection Modem Connection Windows Dial-up Add Direct Serial Link New Dial-up Connection Configure PPP Dial-up Configure SLIP Dial-up Debugging Enabling Debug Debug Level Redirecting Output Function Overview BSD Routines CGI Routines Ethernet Routines FTP Routines HTTP Routines IGMP Routines Miscellaneous Routines Modem Routines PPP Routines Serial Routines SLIP Routines SMTP Routines SNMP Routines System Functions TCP Routines Telnet Routines TFTP Routines UDP Routines RL-CAN RL-USB Example Programs Library Reference Appendix

Example for Sending Data

This example demonstrates the basic concept of sending a large amount of data using a UDP socket.

  • The example sends 64 Kbytes to the remote IP address 192.168.0.100, which is listening on port 1000.
  • The UDP socket will be allocated permanently and will not be released when the data is sent.
  • The data is sent as a stream of bytes.
  • The UDP socket does not wait for acknowledge from the remote peer to ascertain whether the data has been accepted. For this reason, a very simple acknowledge protocol is added to the example. The data will be sent in 512-byte blocks. Upon receiving the packet, the remote peer will send back a simple UDP packet with an acknowledgement. The acknowledgement is simply an index of the received packet starting with 0.

The steps for this example are as follows:

  1. Initialize the system and allocate a free UDP Socket and open it for communication:
    #include <RTL.h>
    
    U8 udp_soc;
    U16 bindex;
    BOOL wait_ack;
    
    void main (void) {
      init_TcpNet ();
      udp_soc = udp_get_socket (0, UDP_OPT_SEND_CS | UDP_OPT_CHK_CS, udp_callback);
      udp_open (udp_soc, 0);
      bindex   = 0;
      wait_ack = __FALSE;
    
  2. Run the main thread and call the send_data() function from an endless loop:
      while (1) {
        timer_poll ();
        main_TcpNet ();
        send_data ();
      }
    }
    
  3. The send_data() function sends UDP Data and waits for acknowledge. Note that the UDP sockets do not support any acknowledgment. The example provides its own acknowledgement.
    void send_data (void) {
      static const U8 rem_IP[4] = {192,168,0,100};
      U8 *sendbuf;
    
      if (wait_ack == __TRUE) {
        return;
      }
      if (bindex < 128) {
        sendbuf = udp_get_buf (512);
        for (i = 0; i < 512; i += 2) {
          sendbuf[i]   = bcount >> 8;
          sendbuf[i+1] = bcount & 0xFF;
        }
        udp_send (udp_soc, rem_IP, 1000, sendbuf, 512);
      }
    }
    
  4. When the packet is sent, wait for the remote acknowledge before proceeding with the next data packet. Use the callback listener function to wait for the remote acknowledge.
    U16 udp_callback (U8 socket, U8 *remip, U16 port, U8 *buf, U16 len)  {
      /* This function is called when UDP data has been received. */
    
      if ((len == 2) && (bindex == (buf[0]<<8 | buf[1]))) {
        wait_ack == __FALSE;
      }
      return (0);
    }
    

Note

  • The example assumes that the Network Interface Adapter is selected, enabled, and properly configured in the Net_Config.c configuration file.
  • If the system runs out of UDP sockets, the application hangs in an endless loop in the system error function with the error code ERR_UDP_ALLOC.
  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.