基于Vxworks的Socket编程

来源:互联网 发布:限制局域网p2p软件 编辑:程序博客网 时间:2024/04/28 06:01

近段时间接触一个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 <stdio.h>#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;        }    }}


0 0
原创粉丝点击