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
心情愉快!
回复
打赏帖 | |
---|---|
C语言函数宏的三种封装方式被打赏50分 | |
嵌入式LinuxC语言程序调试和宏使用技巧被打赏50分 | |
让代码中包含最新的编译时间信息被打赏50分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769LVGL优化显示被打赏26分 | |
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769驱动ST7789以及显示优化被打赏36分 | |
【分享开发笔记,赚取电动螺丝刀】S32K146 PAL模拟I2C驱动适配被打赏23分 | |
我想要一部加热台+电源硬件设计规范被打赏16分 | |
我想要一部加热台+LED背光驱动芯片RT9293知识被打赏18分 | |
【分享开发笔记,赚取电动螺丝刀】S32K146 ADC 模块配置使用被打赏24分 |