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 */

 

原创粉丝点击