vxworks下select()的使用 .
来源:互联网 发布:js计算机制作表格 编辑:程序博客网 时间:2024/06/04 19:24
转载自:http://blog.csdn.net/bobpipi/article/details/4206809
select()作用是挂起一系列的文件描述符,其API为:
int select
(
int width, /* number of bits to examine from 0 */
fd_set * pReadFds, /* read fds */
fd_set * pWriteFds, /* write fds */
fd_set * pExceptFds, /* exception fds (unsupported) */
struct timeval * pTimeOut /* max time to wait, NULL = forever */
)
该函数允许一个任务挂起一系列的文件描述符,直到文件描述符已经准备好时,再将其唤醒。参数pReadFds, pWriteFds, andpExceptFds 分别指向相应的文件描述符,每一个 bit对应一个文件描述符。pReadFds置位将会使select() 挂起读文件描述符,直到相应的文件描述符有数据准备好时才释放。同样pWriteFds将会引起写文件描述符发生相关的操作。pExceptFds在vxworks中没有用到。
下边的一些宏用于设置fd_set()
FD_SET(fd, &fdset)
FD_CLR(fd, &fdset)
FD_ZERO(&fdset)
width为设置的bit数,可以是最大文件描述符数+1,或者FD_SETSIZE。当函数select返回时,将准备好的文件描述符对应的bit 置位,其他的清0。可以使用FD_ISSET 来检查那些被置位。
例: vxworks下基于select的tcp服务器端设计
#include <vxworks.h>
#include <sockLib.h>
#include <inetLib.h>
#include <MyServer.h>
#define DEFAULT_SERVER_PORT 6699
int server;
SEM_ID Server_SM;
/*
* Start the function Server() as a task in AppInit() like this:
* int ret = 0;
* ret = taskSpawn("tServer", 165, 0x0002, 1024,(FUNCPTR) Server,
* 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
*/
void Server()
{
int rc = 0,sd = 0;
int addr_len = 0;
int server_sock = 0;
struct sockaddr_in server_addr,client_addr;
memset(&server_addr,0,sizeof(struct sockaddr_in));
memset(&client_addr,0,sizeof(struct sockaddr_in));
server_sock = socket(AF_INET,SOCK_STREAM,0);
if(server_sock < 0)
{
printf("Failed to create Socket./n");
return;
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(DEFAULT_SERVER_PORT);
rc = bind(server_sock,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in));
if(rc == -1)
{
close(server_sock);
printf("Failed to bind socket/n");
return;
}
rc = listen(server_sock,2);
if(rc == -1)
{
printf("socket listen error/n");
return;
}
printf("TCP server is ready for receive connection request/n");
while(1)
{
addr_len = sizeof(struct sockaddr_in);
sd = accept(server_sock,(struct sockaddr *)&client_addr,&addr_len);
if(sd <= 0)
{
printf("socket accept error/n");
return;
}
else
{
printf("Socket connect success/n");
server = sd;
server_proc(sd);
}
}
}
void server_proc(int sock)
{
int rc = 0;
char buffer[32];
fd_set socket;
struct timeval wait;
wait.tv_sec = 0;
wait.tv_usec = 500000;
while(server > 0)
{
FD_ZERO(&socket);
FD_SET(sock,&socket);
rc = select(FD_SETSIZE,&socket,(fd_set *)0,(fd_set *)0,&wait);
if(rc == 0)
continue;
if(FD_ISSET(sock,&socket))
{
semTake(Server_SM, WAIT_FOREVER);
memset(buffer,0,sizeof(buffer));
rc = recv(sock,buffer,sizeof(buffer),0);
if(rc > 0)
{
/* you can add your application specific code here */
printf("RecvMsg:%s/n",buffer);
semGive(Server_SM);
}
else
{
printf("Socket closed/n");
close(sock);
server = 0;
semGive(Server_SM);
break;
}
}
taskDelay(10);
}
}
/* end of the file */
- vxworks下select()的使用
- vxworks下select()的使用 .
- vxworks下基于select的TCP服务器端设计
- vxworks下基于select的TCP服务器端设计
- vxworks下MUX接口的使用
- vxworks系统下列表的使用
- vxworks下MUX接口的使用
- vxworks下MUX接口的使用
- vxworks系统下列表的使用
- bootrom&vxworks下ftp的使用
- VxWorks下使用SJA1000
- VxWorks下的调试
- VxWorks下消息、信号量的使用和任务创建
- 在vxworks下使用floor等数学函数的注意事项
- VxWorks下消息、信号量的使用和任务创建
- vxworks下辅助时钟aux clk的使用示例
- vxworks下MUX接口的使用-发送全广播包
- VxWorks下使用双向链表lstLib的小例子
- Can't create handler inside thread that has not called Looper.prepare()
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 树莓派Linux下无线网卡无法获取IP,不识别,等问题
- windows下vmware安装mac os全纪录
- c++类的构造函数
- vxworks下select()的使用 .
- 关于Designer中打开USERDB EXPLORER瞬间秒退或崩溃情况
- win server 2003 部署 java程序
- 关于ArcGIS Server API for Flex 模糊查询的方法
- Can't find X includes 和Can't find X libraries
- win7环境变量的位置
- 探索InstallShield——制作一个完整的应用程序安装实例
- 数据结构基本操作源代码
- 各种数据源的ConnectString[转]