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