这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于VxWorks中Select的疑问

共5条 1/1 1 跳转至

关于VxWorks中Select的疑问

菜鸟
2007-07-01 09:35:39     打赏

VxWorks中的select在很多的例子里都是对一个描述符的等待,是不是应该有多个FD_SET然后看看那个先就绪就处理那个,如果只有一个FD_SET是不是就没有多少意义了,这个总是理解的不够




关键词: 关于     VxWorks     Select     疑问    

菜鸟
2007-07-02 19:28:00     打赏
2楼
VxWorks的select跟其它unix类操作系统的select是一个功能,是可以等待多个fd的。否则,真的失去意义了呵呵。

菜鸟
2007-07-22 01:09:00     打赏
3楼

下面这个程序错在那里,为什么不能实现要么只能侦听到新的连接,要么只能从一个socket收发数据,不能再侦听到新的连接

STATUS sinServer(void)
{
SOCK_FD srvSockFd; // 用于侦听的socket描述符
SOCK_FD newSockFd; // 代表和客户连接的socket描述符
struct sockaddr_in clientAddr; // 服务器端点地址
struct sockaddr_in serverAddr; // 客户机端点地址
int clientAddrLength = sizeof(clientAddr); // 端点地址结构体长度

fd_set readFds; // 所有文件描述符的标识位集合,指明调用select()的任务在哪些文件描述符上阻塞
int selWidth = 0; // fd_set中需要监视的位数
// Create a socket
if((srvSockFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == ERROR)
{
error("Socket failed");
return(ERROR);
}

/*
* Bind to a well known address. INADDR_ANY says any network
* interface will do. hton?() routines put things in network
* byte order
*/
// 初始化服务器的本地端点地址,与socket绑定
bzero((char *)&serverAddr, SA_LEN);
serverAddr.sin_len = (u_char)SA_LEN;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(SRV_PORT);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(srvSockFd, (struct sockaddr *)&serverAddr, SA_LEN) == ERROR)
{
close(srvSockFd);
error("Bind failed");
return(ERROR);
}

// 声明要在绑定地址后的socket上侦听客户连接请求
if(listen(srvSockFd, MAX_CONNECTION) == ERROR)
{
close(srvSockFd);
error("Listen failed");
return(ERROR);
}

printf("Server: Port %d ready...\n", SRV_PORT);

// Service requests
FD_ZERO(&readFds);
FD_SET(srvSockFd, &readFds);
selWidth = srvSockFd + 1;
FOREVER
{
if((i=select(selWidth, &readFds, NULL, NULL, NULL)) == ERROR)
{
error("Select failed");
return ERROR;
}
if(FD_ISSET(srvSockFd, &readFds))
{
newSockFd = accept(srvSockFd, (struct sockaddr *) &clientAddr, &clientAddrLength);
if(newSockFd == ERROR)
{
close(srvSockFd);
error("Accept failed");
return(ERROR);
}

FD_SET(newSockFd, &readFds);
if(newSockFd + 1 > selWidth)
selWidth = newSockFd + 1;

printf("Server: the connected client ip=[%s] port=[%u]\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
}
else if(FD_ISSET(newSockFd, &readFds))
{
doRequest(newSockFd);
}
}
return OK;
}


菜鸟
2007-07-22 01:44:00     打赏
4楼
为何我有多个FD_SET时总是最后一个有效,其他的都没有反应?

菜鸟
2007-07-22 03:29:00     打赏
5楼

问题已解决,如下

FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化

FD_SET(sock,&fds); //添加描述符

FD_SET(fp,&fds); //同上

maxfdp=sock>fp?sock+1:fp+1; //描述符最大值加1

心情愉快!


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]