 | RL-ARM User's Guide |  |
|
|
| Example for Sending DataThis 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: - 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;
- Run the main thread and call the send_data() function from an endless loop:
while (1) {
timer_poll ();
main_TcpNet ();
send_data ();
}
}
- 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);
}
}
- 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.
|
|