vxWorks上使用select接收TCP报文

本文介绍了一个基于VxWorks操作系统的TCP服务器实现方法。该服务器使用lstLib库管理连接的客户端,并通过socket编程实现数据接收。代码展示了如何监听端口、接受连接请求及设置套接字缓冲区。

使用lstLib把所有建立链接的FD加入到链表中

#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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值