What protocol do you use UDP or TCP? I just implemented a task for the same
system (EVK1100/FreeRTOS/lwIP). It receives UDP datagrams from a multicast
address on different ports. I attached the file to show you how select() can
be used. For answering the requests you could write a second task which gets
woken by the receiver task (e.g. use queues to signalize the request).

Regards, Mathias


  -----Ursprüngliche Nachricht-----
  Von: [email protected]
[mailto:[email protected]]im Auftrag von
Oscar F
  Gesendet: Freitag, 4. September 2009 12:28
  An: Mailing list for lwIP users
  Betreff: [lwip-users] help with socket!!


  Hello everybody, my customer said me that i need to create 8 socket of
communication with diferent port.


  There will be 8 logical links with a Port number associated:



                          -           RQ1 Port Number = 1500H           (=
6376 dec)

                          -           RQ2 Port Number = 1501H           (=
6377 dec)

                          -           RQ3 Port Number = 1502H           (=
6378 dec)



                          -           RP1- Port Number = 1600H           (=
6632 dec)

                          -           RP2-Port Number = 1601H           (=
6633 dec)

                          -           RP3-Port Number = 1602H           (=
6634 dec)

                          -           RP4-Port Number = 1603H           (=
6635 dec)

                          -           RP5-Port Number = 1604H          (=
6636 dec)




  Each answer and request goes form diferent socket.




  I have the evk1100 with avr32, and i use the lwip 1.3.0 with free RTOS
port to this micro.





  Can i create 8 socket, and wait for request of them and answed for other ?




  in the program run other task, do you recommended use the lwip_select
function to block for request, and the task state will be blocked and other
task can be runned?




  Thank you for all

  Regards

  Oscar



/************************************************************************
 * Includes
 ************************************************************************/
// FreeRTOS includes
#include "FreeRTOS.h"
#include "task.h"

// lwIP includes
#include "lwip/netif.h"
#include "lwip/sockets.h"

#include "string.h"
#include "print_funcs.h"


/************************************************************************
 * Imports
 ************************************************************************/


/************************************************************************
 * Prototypes
 ************************************************************************/
static void prvMulticastInitTask(void);

static void prvMulticastProcessReply_X(void);

static void prvMulticastProcessReply_Y(void);

static void prvMulticastProcessReply_Z(void);


/************************************************************************
 * Type definitions
 ************************************************************************/
typedef struct {
        int                                             socket;
        struct sockaddr_in              addr;
        U16                                             port;
        ip_mreq                                 mreq;
} tmcast_socket;


/************************************************************************
 * Constants
 ************************************************************************/


/************************************************************************
 * Global variables
 ************************************************************************/


/************************************************************************
 * Task local variables
 ************************************************************************/
static U8 ucMulticastRecBuffer_X[multicastBUFFER_SIZE_X];
static U8* pucMulticastRecBuffer_X = &ucMulticastRecBuffer_X[0];

static U8 ucMulticastRecBuffer_Y[multicastBUFFER_SIZE_Y];
static U8* pucMulticastRecBuffer_Y = &ucMulticastRecBuffer_Y[0];

static U8 ucMulticastRecBuffer_Z[multicastBUFFER_SIZE_Z];
static U8* pucMulticastRecBuffer_Z = &ucMulticastRecBuffer_Z[0];


/************************************************************************
 * Methods
 ************************************************************************/
portTASK_FUNCTION(vMulticast, pvParameters) {
        // Descriptor set and structures for multicast sockets
        fd_set fd;
        tmcast_socket ntp_socket;
        tmcast_socket cfg_socket;
        tmcast_socket sn_socket;

        // Helpers
        int ret;
        socklen_t len;

        // The parameters are not used
        (void)pvParameters;

        // Initialize task members
        prvMulticastInitTask();

        // Setup socket X
        x_socket.port = multicastPORT_X;
        if (prucMulticastSetupSocket(&x_socket) == 0) {
                print_dbg("multicast.c: X socket creation failed.\n");
        }

        // Setup socket Y
        y_socket.port = multicastPORT_Y;
        if (prucMulticastSetupSocket(&y_socket) == 0) {
                print_dbg("multicast.c: Y socket creation failed.\n");
        }

        // Setup socket Z       
        z_socket.port = multicastPORT_Z;
        if (prucMulticastSetupSocket(&z_socket) == 0) {
                print_dbg("multicast.c: Z socket creation failed.\n");
        }

        // Task loop
        while (1) {
                // Clear descriptor set
                FD_ZERO(&fd);
                // Add sockets to descriptor set
                FD_SET(x_socket.socket, &fd);
                FD_SET(y_socket.socket, &fd);           
                FD_SET(z_socket.socket, &fd);
                
                // Check for received packets on configured sockets (blocking 
indefinite)
                ret = select(FD_SETSIZE, &fd, NULL, NULL, NULL);

                if (ret < 0) {
                        print_dbg("multicast.c: Select failed.\n");
                }
                if (ret == 0) {
                        print_dbg("multicast.c: Select timeout.\n");
                }
                if (ret > 0) {
                        if (FD_ISSET(x_socket.socket, &fd)) {
                                // Receive X packet
                                len = sizeof(x_socket.addr);
                                if (recvfrom(x_socket.socket, 
pucMulticastRecBuffer_X, multicastBUFFER_SIZE_X, 0, (struct sockaddr 
*)&(x_socket.addr), &len) >= 0) {
                                        prvMulticastProcessReply_X();
                                        print_dbg("Multicast.c: X packet 
received.\n");
                                }
                        }
                        if (FD_ISSET(y_socket.socket, &fd)) {
                                // Receive Y packet
                                len = sizeof(y_socket.addr);
                                if (recvfrom(y_socket.socket, 
pucMulticastRecBuffer_Y, multicastBUFFER_SIZE_Y, 0, (struct sockaddr 
*)&(y_socket.addr), &len) >= 0) {
                                        prvMulticastProcessReply_Y();
                                        print_dbg("Multicast.c: Y packet 
received.\n");
                                }
                        }
                        if (FD_ISSET(z_socket.socket, &fd)) {
                                // Receive Z packet
                                len = sizeof(z_socket.addr);
                                if (recvfrom(z_socket.socket, 
pucMulticastRecBuffer_Z, multicastBUFFER_SIZE_Z, 0, (struct sockaddr 
*)&(z_socket.addr), &len) >= 0) {
                                        prvMulticastProcessReply_Z();
                                        print_dbg("Multicast.c: Z packet 
received.\n");
                                }
                        }
                }
        }
        // Leave multicast group and close sockets (never executed)
        setsockopt(x_socket.socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, 
&(x_socket.mreq), sizeof(ip_mreq));
        close(x_socket.socket);
        setsockopt(y_socket.socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, 
&(y_socket.mreq), sizeof(ip_mreq));
        close(y_socket.socket); 
        setsockopt(z_socket.socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, 
&(z_socket.mreq), sizeof(ip_mreq));
        close(z_socket.socket);
}

/**
 * Initialize task members.
 */
static void prvMulticastInitTask() {
        // Initialize buffers
        memset(&ucMulticastRecBuffer_X, 0, multicastBUFFER_SIZE_X);
        memset(&ucMulticastRecBuffer_Y, 0, multicastBUFFER_SIZE_Y);
        memset(&ucMulticastRecBuffer_Z, 0, multicastBUFFER_SIZE_Z);
}

/**
 * Process X reply.
 */
static void prvMulticastProcessReply_X(void) {
        // TODO
}

/**
 * Process Y reply.
 */
static void prvMulticastProcessReply_Y(void) {
        // TODO
}

/**
 * Process Z reply.
 */
static void prvMulticastProcessReply_Z(void) {
        // TODO
}

static U8 prucMulticastSetupSocket(void* mcast) {
        // Local pointer
        tmcast_socket *p_mcast = (tmcast_socket*)mcast;

        // Create socket (same as UDP socket)
        if ((p_mcast->socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                return 0;
        }

        // Set up address
        memset(&(p_mcast->addr), 0, sizeof(struct sockaddr_in));
        p_mcast->addr.sin_family = AF_INET;
        p_mcast->addr.sin_addr.s_addr = htonl(INADDR_ANY);
        p_mcast->addr.sin_port = htons(p_mcast->port);

        // Bind to address
        if (bind(p_mcast->socket, (struct sockaddr*)&(p_mcast->addr), 
sizeof(struct sockaddr_in)) < 0) {
                return 0;
        }

        // Join multicast group
        p_mcast->mreq.imr_multiaddr.s_addr = inet_addr(pcConfctrlGetAddrPtr());
        p_mcast->mreq.imr_interface.s_addr = htonl(INADDR_ANY);
        if (setsockopt(p_mcast->socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
&(p_mcast->mreq), sizeof(ip_mreq)) < 0) {
                return 0;
        }

        // Socket setup successful
        return 1;
}
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to