Use select to receive TCP packets on vxWorks

Use lstLib to add all linked FDs to the linked list

#include<vxworks.h>
#include"sockLib.h"
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"lstLib.h"
int sockFd;
int newSockFd;

int maxRxFd=0;

typedef struct clientsList
{
    NODE    fdNode;
    int     fd;
}FDNODE;

LIST cl;
char *buffer;
void tcpListenTask (void)
{
    struct sockaddr_in saddr,caddr;
    int bufLen=1500;


    lstInit(&cl);

    int addrLen;
    int nRead=0;

    bzero ((char *) &saddr, sizeof (saddr));
    bzero ((char *) &caddr, sizeof (caddr));




    buffer=malloc(bufLen);

    if(bufLen==NULL)
    {
        return;
    }
    if ((sockFd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
    {
        free (buffer);
        return;
    }

    saddr.sin_family       = AF_INET;
    saddr.sin_port = htons (50000);
    saddr.sin_addr.s_addr=INADDR_ANY;


    if(bind(sockFd, (struct sockaddr *)&saddr, sizeof(saddr))<0)
    {
        free (buffer);
        return;
    }

    if(setsockopt(sockFd, SOL_SOCKET, SO_RCVBUF,(char *) &bufLen, sizeof (bufLen)) < 0)
    {
        printf ("setsockopt SO_RCVBUF failed\n");
        free (buffer);
        return;
    }


    if (setsockopt (sockFd, SOL_SOCKET, SO_SNDBUF, (void *)&bufLen,
                     sizeof (bufLen)) < 0)
    {
        printf ("setsockopt SO_SNDBUF failed\n");
        free (buffer);
        return;
    }

    if (listen (sockFd, 5) < 0)
    {
        printf ("listen failed\n");
        close (sockFd);
        free (buffer);
        return;
    }
    addrLen=sizeof(caddr);

    while (1)
    {
        newSockFd = accept(sockFd, (struct sockaddr *)&caddr, &addrLen);
        if(newSockFd>0)
        {

            FDNODE *pFd;
            printf("new socket connected\n");

            if(setsockopt(newSockFd, SOL_SOCKET, SO_RCVBUF,(char *) &bufLen, sizeof (bufLen)) < 0)
            {
                printf ("setsockopt SO_RCVBUF failed\n");

                free (buffer);
                return;
            }


            if (setsockopt (newSockFd, SOL_SOCKET, SO_SNDBUF, (void *)&bufLen,
                             sizeof (bufLen)) < 0)
            {
                printf ("setsockopt SO_SNDBUF failed\n");
                free (buffer);
                return;
            }
            pFd=malloc(sizeof(FDNODE));
            pFd->fd=newSockFd;
            lstAdd(&cl,pFd);
            maxRxFd=newSockFd;
        }
    }


}
void tcpRxTask(void)
{
    int num=0;
    fd_set readFds;
    FDNODE *pfd;
    struct timeval timeout;
    timeout.tv_sec = 3;
    timeout.tv_usec = 0;
    int nRead;

    while(1)
    {
        FD_ZERO(&readFds);
        pfd= lstFirst(&cl);
        while(pfd)
        {
            FD_SET(pfd->fd,&readFds);
            pfd=lstNext(pfd);
        }

        num=select(maxRxFd,&readFds,NULL,NULL,&timeout);
        if(num>0)
        {
            pfd= lstFirst(&cl);
            while(pfd)
            {
                if (FD_ISSET(pfd->fd, &readFds))
                {
                    do
                    {
                        nRead=recv(pfd->fd,buffer,1500,0);
                        buffer=buffer+nRead;
                    }while(nRead>0);
                }
            }
            pfd=lstNext(pfd);
        }
}


void createTask(void)
{
    (void)taskSpawn("LsnTask", 150, 0, 8192, (FUNCPTR)tcpListenTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    (void)taskSpawn("tRxTask", 150, 0, 8192, (FUNCPTR)tcpRxTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325477581&siteId=291194637