基于Vxworks的Socket编程

近段时间接触一个Vxworks的项目,写了一些关于Vxworks的的Socket代码,放到这里来,请大家指正。

h文件

#ifndef _SERVER_H_
#define _SERVER_H_

#define MAX_CLIENT_NUM      1
#define SERVER_PORT         6000
#define NET_TASK_PRI        190
#define LISTEN_TASK_PRI     195
#define NET_TASK_STACK      0x2000
#define LISTEN_TASK_STACK   0x1000
#define MAX_PKT_LEN         1518

/* PKT type begin */
#define TYPE_PKT_DEV_STATE_REQ              0x01
#define TYPE_PKT_DEV_STATE_ACK              0x02
#define TYPE_PKT_CTL_PARA_SET               0x03
#define TYPE_PKT_CTL_PARA_ACK               0x04
#define TYPE_PKT_MSG_PARA_SET               0x05
#define TYPE_PKT_MSG_PARA_ACK               0x06
#define TYPE_PKT_MSG_CTL_SET                0x07
#define TYPE_PKT_MSG_CTL_ACK                0x08
#define TYPE_PKT_SYS_TEST_REQ               0x09
#define TYPE_PKT_SYS_TEST_ACK               0x0A
#define TYPE_PKT_SYS_TEST_DATA              0x0B
#define TYPE_PKT_BIG_FILE_TEST_REQ          0x0C
#define TYPE_PKT_BIG_FILE_TEST_ACK          0x0D
#define TYPE_PKT_BIG_FILE_TEST_DATA         0x0E
#define TYPE_PKT_DEV_MONITOR                0x0F
#define TYPE_PKT_REAL_MSG                   0x10
#define TYPE_PKT_NT_MSG_SET                 0x11
#define TYPE_PKT_NT_MSG_ACK                 0x12
/* PKT type end */

/* Decode Pkt use */
#define GET_ONE_BYTE(packet, parseLen, value) \
{\
    (value) = *(packet);\
    (parseLen) += 1;\
}

#define GET_TWO_BYTE(packet, parseLen, value) \
{\
    memcpy((void *)&(value), (void *)(packet), 2);\
    (value) = ntohs(value);\
    (parseLen) += 2;\
}

#define GET_FOUR_BYTE(packet, parseLen, value) \
{\
    memcpy((void *)&(value), (void *)(packet), 4);\
    (value) = ntohl(value);\
    (parseLen) += 4;\
}

#endif

c文件

#include "Vxworks.h"
#include 
#include "..\h\server.h"
#include "sockLib.h"
#include "inetLib.h"
#include "ioLib.h"
#include "taskLib.h"

void NetRecvTask(INT32 iClientSocket)
{
    INT8    ai1PktBuff[MAX_PKT_LEN] =   {0, };
    INT32   iReadLen                =   0;
    UINT32  uDecodeLen              =   0;
    UINT8   uPktType                =   0;

    while ( 1 )
    {
        iReadLen = recv(iClientSocket, ai1PktBuff, MAX_PKT_LEN, 0);
        if (iReadLen <= 0)
        {
            printf("Socket close .\r\n");
            closesocket(iClientSocket);
            return ;
        }

        uDecodeLen = 0;
        GET_ONE_BYTE(ai1PktBuff, uDecodeLen, uPktType);

        switch( uPktType )
        {
            case TYPE_PKT_DEV_STATE_REQ:
                printf("Recv a BIT packet, ");
                break;

            case TYPE_PKT_CTL_PARA_SET:
                printf("Recv a dev para config packet, ");
                break;

            case TYPE_PKT_MSG_PARA_SET:
                printf("Recv a msg para config packet, ");
                break;

            case TYPE_PKT_MSG_CTL_SET:
                printf("Recv a msg control packet, ");
                break;

            case TYPE_PKT_SYS_TEST_REQ:
                printf("Recv a system test packet, ");
                break;

            case TYPE_PKT_BIG_FILE_TEST_REQ:
                printf("Recv a big file test request packet, ");
                break;

            case TYPE_PKT_NT_MSG_SET:
                printf("Recv a msg data packet, ");
                break;

            default:
                printf("Recv a unkown type packet, ");
                break;
        }

        printf("len = %d\r\n", iReadLen);
    }
}

void ServerStart()
{
    INT32   iTaskID =   0;

    iTaskID = taskSpawn("ListenClient", LISTEN_TASK_PRI, 0, LISTEN_TASK_STACK, (FUNCPTR)ListenTask, 
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    if (ERROR == iTaskID)
    {
        printf("Task create fuilure.\r\n");
    }

    return ;
}

void ListenTask()
{
    INT32   iListenSocket   =   0;
    INT32   iClientSocket   =   0;
    INT8    iOpt            =   0;
    INT32   iOptLen         =   0;
    INT32   iRet            =   0;
    INT32   iTaskId         =   0;
    struct sockaddr_in SrvAddr      =   {0, };
    struct sockaddr_in ClientAddr   =   {0, };

    iListenSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (ERROR == iListenSocket)
    {
        printf("Create socket failure.\r\n");
        return ;
    }

    iOpt = 1;
    iOptLen = sizeof(INT8);
    setsockopt(iListenSocket, SOL_SOCKET, SO_REUSEADDR, (INT8*)&iOpt, iOptLen);

    SrvAddr.sin_family = AF_INET;
	SrvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	SrvAddr.sin_port = htons(SERVER_PORT);

    iRet = bind(iListenSocket, (SOCKADDR*)&SrvAddr, sizeof(SOCKADDR));
    if (ERROR == iRet)
    {
        printf("Socket bind failure.\r\n");
        return ;
    }

    iRet = listen(iListenSocket, MAX_CLIENT_NUM);
    if (ERROR == iRet)
    {
        printf("Socket listen failure.\r\n");
        return ;
    }
    printf("Listen port, %d\r\n", SERVER_PORT);

    iOptLen = sizeof(struct sockaddr_in);

    while ( 1 )
    {
        printf("Wait for client to connect.\r\n");
        iClientSocket = accept(iListenSocket, (struct sockaddr*)&ClientAddr, &iOptLen);
        if (iClientSocket <= 0)
        {
            printf("Socket accept failure.\r\n");
            taskDelay(3000);
            continue;
        }

        printf("A client connect, socket id = %d\r\n", iClientSocket);

        iTaskId = taskSpawn("NetRecv", NET_TASK_PRI, 0, NET_TASK_STACK, (FUNCPTR)NetRecvTask, 
                            iClientSocket, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        if (ERROR == iTaskId)
        {
            printf("Task create fuilure.\r\n");
            closesocket(iClientSocket);
            taskDelay(3000);
            continue;
        }
    }
}


你可能感兴趣的:(基于Vxworks的Socket编程)