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
心情愉快!
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
我要赚赏金打赏帖 |
|
|---|---|
| Chaos-nano:专为低资源单片机设计的轻量级协作式异步操作系统(ATMEGA328P轻量级操作系统)—— 详细介绍被打赏¥16元 | |
| FPGA配置被打赏¥10元 | |
| Chaos-nano协作式异步操作系统:赋能MicrochipAVR8位单片机的革新之路被打赏¥15元 | |
| 基于esp32开发时串口工具的注意点被打赏¥24元 | |
| 基于FireBeetle2ESP32-C5开发板的舵机控制被打赏¥20元 | |
| 【分享开发笔记,赚取电动螺丝刀】MAX78000开发板制作的电子相册被打赏¥32元 | |
| 基于FireBeetle2ESP32-C5开发板的超声波测距及显示被打赏¥21元 | |
| FireBeetle2ESP32-C5上RTC电子时钟的实现被打赏¥25元 | |
| 【分享开发笔记,赚取电动螺丝刀】MAX78000开发板读取SD卡被打赏¥23元 | |
| 【S32K3XX】Standby RAM 重启后数据异常问题调查被打赏¥38元 | |
我要赚赏金
