基于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
- 基于Vxworks的Socket编程
- 基于VxWorks嵌人式操作系统的C/S模式网络编程
- 基于TCP的socket编程
- 基于UDP的socket编程- -
- 基于UDP的socket编程
- 基于UDP的socket编程
- 基于TCP的socket编程
- 基于UDP的socket编程
- 基于Python的socket编程
- 基于TCP的socket编程
- 基于TCP的socket编程
- 基于TCP的socket编程
- 基于UDP的socket编程
- 基于TCP的Socket 编程
- 基于TCP的socket编程
- 基于UDP的socket编程
- 基于UDP的socket编程
- 基于udp的socket编程
- thinkphp 同一控制器内方法跳转
- WingIDE 5.0注册机
- MATLAB 小经验积累(3):字符串连接
- R语言数据挖掘之开篇——参考书选择
- 你好!MariaDB数据库~
- 基于Vxworks的Socket编程
- adk新建 安卓程序的时候 src下无文件
- Java bean工具类
- Gas Station
- zend framework2 路由问题详细解答
- 在VS2010 下编译 cocos2d-x-2.1.4
- HDU 1874 (最短路--Floyd算法)
- 建立双链表
- 黑马程序员_Eclipse 快捷键