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
心情愉快!
回复
我要赚赏金打赏帖 |
|
|---|---|
| OK1126B-S开发板下以导航按键控制云台/机械臂姿态调整被打赏¥29元 | |
| 【树莓派5】便携热成像仪被打赏¥36元 | |
| 【树莓派5】环境监测仪被打赏¥35元 | |
| OK1126B-S开发板下多时段语音提示型电子时钟被打赏¥27元 | |
| OK1126B-S开发板下函数构建及步进电机驱动控制被打赏¥25元 | |
| 【S32K3XX】LPI2C 参数配置说明被打赏¥20元 | |
| OK1126B-S开发板的脚本编程及应用设计被打赏¥27元 | |
| 5v升压8.4v两节锂电池充电芯片,针对同步和异步的IC测试被打赏¥35元 | |
| 【S32K3XX】S32DS LPI2C 配置失败问题解决被打赏¥22元 | |
| 【S32K3XX】FLASH 的 DID 保护机制被打赏¥19元 | |
我要赚赏金
