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

下面这个程序错在那里,为什么不能实现要么只能侦听到新的连接,要么只能从一个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;
}


问题已解决,如下
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sock,&fds); //添加描述符
FD_SET(fp,&fds); //同上
maxfdp=sock>fp?sock+1:fp+1; //描述符最大值加1
心情愉快!
回复
打赏帖 | |
---|---|
汽车电子中巡航控制系统的使用被打赏10分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K146】S32DS RTD 驱动环境搭建被打赏12分 | |
【分享开发笔记,赚取电动螺丝刀】【IAR】libc标注库time相关库函数使用被打赏23分 | |
LP‑MSPM0L1306开发版试用结果被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【LP-MSPM0L1306】适配 RT-Thread Nano被打赏23分 |