Difference between revisions of "Simple UDP Example"

From Embedded Xinu
Jump to navigation Jump to search
 
(One intermediate revision by the same user not shown)
Line 4: Line 4:
  
 
=== Usage ===
 
=== Usage ===
* Add the both of the files to the shell directory as xsh_echoclient.c and xsh_echserver.c
+
* Add the both of the files to the shell directory as xsh_udpclient.c and xsh_udpserver.c
* Modify shell.c and shell.h to include the echoclient and echoserver commands.
+
* Modify shell.c and shell.h to include the udpclient and udpserver commands.
 +
* Modify the Makefile in the shell directory to include xsh_udpclient.c and xsh_udpserver.c and then make XINU from the compile directory
 
* Boot two separate XINU consoles
 
* Boot two separate XINU consoles
 
* Run netup command from the shell on both consoles
 
* Run netup command from the shell on both consoles
* Run testserver on the first console
+
* Run udpserver from the shell on the first console
* Run echoclient with the arguments of the echoserver's ip and the message to be sent in quotes
+
* Run udpclient from the shell on the second console with the arguments of the udpserver's ip and the message to be sent in quotes
** eg: echoclient 192.168.6.102 "Hello XINU World!"
+
** eg: udpclient 192.168.6.102 "Hello XINU World!"
  
 
=== Source ===
 
=== Source ===
'''Echo Client'''
+
'''UDP Client'''
 
  <nowiki>
 
  <nowiki>
 
#include <stddef.h>
 
#include <stddef.h>
Line 27: Line 28:
  
 
/**
 
/**
* Shell command (echoclient) runs a client that sends an ASCII message over the network to a server using UDP.
+
* Shell command (udpclient) runs a client that sends an ASCII message over the network to a server using UDP.
 
* Expects arg0 to be echoclient, args1 to be the destination IP address, args2 to be the message in quotes
 
* Expects arg0 to be echoclient, args1 to be the destination IP address, args2 to be the message in quotes
 
* @param nargs number of arguments in args array
 
* @param nargs number of arguments in args array
Line 33: Line 34:
 
* @return non-zero value on error
 
* @return non-zero value on error
 
*/
 
*/
shellcmd xsh_echoclient(int nargs, char *args[])
+
shellcmd xsh_udpclient(int nargs, char *args[])
 
{
 
{
 
     ushort dev = 0;
 
     ushort dev = 0;
Line 91: Line 92:
 
</nowiki>
 
</nowiki>
  
'''Echo Server'''
+
'''UDP Server'''
 
  <nowiki>
 
  <nowiki>
 
#include <stddef.h>
 
#include <stddef.h>
Line 104: Line 105:
  
 
/**
 
/**
* Shell command (echoserver) runs a UDP server that waits for an incoming message, and then prints it out. Does not expect any arguments.
+
* Shell command (udpserver) runs a UDP server that waits for an incoming message, and then prints it out. Does not expect any arguments.
 
* @param nargs number of arguments in args array
 
* @param nargs number of arguments in args array
 
* @param args array of arguments
 
* @param args array of arguments

Latest revision as of 21:46, 13 June 2011

About

This is a dead simple example of how to use the UDP networking features in XINU 2.0.


Usage

  • Add the both of the files to the shell directory as xsh_udpclient.c and xsh_udpserver.c
  • Modify shell.c and shell.h to include the udpclient and udpserver commands.
  • Modify the Makefile in the shell directory to include xsh_udpclient.c and xsh_udpserver.c and then make XINU from the compile directory
  • Boot two separate XINU consoles
  • Run netup command from the shell on both consoles
  • Run udpserver from the shell on the first console
  • Run udpclient from the shell on the second console with the arguments of the udpserver's ip and the message to be sent in quotes
    • eg: udpclient 192.168.6.102 "Hello XINU World!"

Source

UDP Client

#include <stddef.h>
#include <stdio.h>
#include <device.h>
#include <ether.h>
#include <udp.h>
#include <string.h>

#define MSG_MAX_LEN 64
#define ECHO_PORT 9989


/**
* Shell command (udpclient) runs a client that sends an ASCII message over the network to a server using UDP.
* Expects arg0 to be echoclient, args1 to be the destination IP address, args2 to be the message in quotes
* @param nargs number of arguments in args array
* @param args array of arguments
* @return non-zero value on error
*/
shellcmd xsh_udpclient(int nargs, char *args[])
{
    ushort dev = 0;
    char buf[MSG_MAX_LEN];

    char *dest = args[1];

    struct netaddr dst;
    struct netaddr *localhost;
    struct netif *interface;


    /* Allocate a new UDP device */
    if ((ushort)SYSERR == (dev = udpAlloc()))
    {
        fprintf(stderr, "Client: Failed to allocate a UDP device.");
        return SYSERR;
    }

    /* Look up local ip info */
    interface = netLookup((ethertab[0].dev)->num);
    if (NULL == interface)
    {
        fprintf(stderr, "Client: No network interface found\r\n");
        return SYSERR;
    }
    localhost = &(interface->ip);
    
    /* Change the destination to ipv4 */
    if (SYSERR == dot2ipv4(dest, &dst))
    {
        fprintf(stderr, "Client: Failed to convert ip address.");
        return SYSERR;
    }

    /* Open the UDP device with the destination and echo port*/
    if (SYSERR == open(dev, localhost, &dst, NULL, ECHO_PORT))
    {
        fprintf(stderr, "Client: Could not open the UDP device\r\n");
        return SYSERR;
    }

    /* Send the message to the destination*/
    memcpy(buf, args[2], MSG_MAX_LEN);
    
    if(SYSERR == write(dev, buf, MSG_MAX_LEN))
    {
        close(dev);
        return SYSERR;
    }

    /* Closee the device when done */
    close(dev);

    return 0;
}

UDP Server

#include <stddef.h>
#include <stdio.h>
#include <device.h>
#include <udp.h>
#include <stdlib.h>
#include <ether.h>
#include <string.h>

#define ECHO_PORT 9989

/**
* Shell command (udpserver) runs a UDP server that waits for an incoming message, and then prints it out. Does not expect any arguments.
* @param nargs number of arguments in args array
* @param args array of arguments
* @return non-zero value on error
*/
shellcmd xsh_echoserver(int nargs, char *args[])
{
    ushort dev = 0;
    int len = 0;

    char buffer[UDP_MAX_DATALEN];

    struct netaddr *localhost;

    struct netif *interface;
    struct udpPseudoHdr *pseudo;
    struct udpPkt *udp;


    /* Allocate a new UDP device */
    if ((ushort)SYSERR == (dev = udpAlloc()))
    {
        fprintf(stderr, "Server: Failed to allocate a UDP device.\r\n");
        return SYSERR;
    }

    /* Look up local ip info */
    interface = netLookup((ethertab[0].dev)->num);

    if (NULL == interface)
    {
        fprintf(stderr, "Server: No network interface found\r\n");
        return SYSERR;
    }


    /* Open the UDP device using localhost and the echo port to listen to*/
    localhost = &(interface->ip);

    if (SYSERR == open(dev, localhost, NULL, ECHO_PORT, NULL))
    {
        fprintf(stderr, "Server: Could not open the UDP device\r\n");
        return SYSERR;
    }

    /* Set the UDP device to passive mode */
    if (SYSERR == control(dev, UDP_CTRL_SETFLAG, UDP_FLAG_PASSIVE, NULL))
    {
        kprintf("Server: Could not set UDP device to passive mode\r\n");
        close(dev);
        return SYSERR;
    }


    /* Read lop, wait for a new request */
    printf("Server: Waiting for message\r\n");

    while (SYSERR != (len = read(dev, buffer, UDP_MAX_DATALEN)))
    {
        pseudo = (struct udpPseudoHdr *)buffer;
        udp = (struct udpPkt *)(pseudo + 1);
        printf("Server: Received Message - %s\r\n", udp->data);
    }

        close(dev);

    return 0;
}