FD_ISSET(m_fd, &rfds)
时间: 2023-12-17 09:02:37 浏览: 19
这是一个与计算机网络编程相关的问题。`FD_ISSET()`是一个宏定义,用于检查文件描述符集合中是否存在某个特定的文件描述符。在这个例子中,`m_fd`是一个文件描述符,`&rfds`是一个文件描述符集合。`FD_ISSET(m_fd, &rfds)`用于检查`m_fd`是否在`rfds`集合中,如果在则返回非零值,否则返回0。
相关问题
linux select判断fd_set个数
在使用 `select` 函数进行 I/O 多路复用时,需要对返回值进行判断以确定有哪些文件描述符就绪。`select` 函数的返回值表示就绪文件描述符的数量,如果返回值为 0,则说明在超时时间内没有文件描述符就绪;如果返回值为 -1,则说明 `select` 函数调用失败。
在判断就绪的文件描述符时,可以使用 `FD_ISSET` 函数对每个文件描述符进行判断。`FD_ISSET` 函数返回值为非零表示该文件描述符存在于集合中,为零表示不存在于集合中。
如果需要统计有多少个文件描述符就绪,可以遍历文件描述符集合,对每个文件描述符调用 `FD_ISSET` 函数进行判断,并累加计数。
下面是一个简单的示例代码,用于统计有多少个文件描述符就绪:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
#include <unistd.h>
int main() {
fd_set rfds; // 用于存储文件描述符集合的 fd_set 结构体
int maxfd = STDIN_FILENO + 1; // 待监视的最大文件描述符值加一
struct timeval timeout = {5, 0}; // 超时时间为 5 秒
while (1) {
FD_ZERO(&rfds); // 将读文件描述符集合清零
FD_SET(STDIN_FILENO, &rfds); // 将标准输入加入到读文件描述符集合
// 调用 select 函数进行 I/O 多路复用
int ret = select(maxfd, &rfds, NULL, NULL, &timeout);
if (ret < 0) {
perror("select error");
exit(1);
} else if (ret == 0) {
printf("timeout\n");
} else {
int count = 0;
// 遍历文件描述符集合,统计有多少个文件描述符就绪
for (int fd = 0; fd < maxfd; fd++) {
if (FD_ISSET(fd, &rfds)) {
count++;
}
}
printf("%d file descriptor(s) are ready\n", count);
// 如果标准输入可读,进行读操作
if (FD_ISSET(STDIN_FILENO, &rfds)) {
char buf[1024];
int n = read(STDIN_FILENO, buf, sizeof(buf));
if (n < 0) {
perror("read error");
exit(1);
} else if (n == 0) {
printf("EOF\n");
break;
} else {
printf("read: %s", buf);
}
}
}
}
return 0;
}
```
在该程序中,当 `select` 函数返回时,程序首先遍历文件描述符集合,统计有多少个文件描述符就绪,然后通过 `FD_ISSET` 函数判断标准输入是否可读,如果可读则进行读操作。
select ssl_pending ssl_read 阻塞模型读应用数据,代码举例
下面是一个基于阻塞模型的SSL连接读取应用数据的示例代码,使用了select函数来检测是否有可读数据和是否有未处理的SSL数据:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <errno.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define SERVER_ADDR "127.0.0.1"
#define SERVER_PORT 8080
int main(int argc, char **argv) {
int sockfd, ret;
struct sockaddr_in server_addr;
char buf[1024];
fd_set rfds;
struct timeval tv;
SSL_CTX *ctx;
SSL *ssl;
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
return -1;
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
server_addr.sin_port = htons(SERVER_PORT);
// 连接服务器
ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret < 0) {
perror("connect");
return -1;
}
// 初始化SSL
SSL_library_init();
ctx = SSL_CTX_new(SSLv23_client_method());
if (ctx == NULL) {
perror("SSL_CTX_new");
return -1;
}
ssl = SSL_new(ctx);
SSL_set_fd(ssl, sockfd);
SSL_connect(ssl);
// 从服务器读取数据并发送应答
while (1) {
FD_ZERO(&rfds);
FD_SET(sockfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
ret = select(sockfd + 1, &rfds, NULL, NULL, &tv);
if (ret < 0) {
perror("select");
break;
} else if (ret == 0) {
printf("timeout\n");
continue;
} else {
if (FD_ISSET(sockfd, &rfds)) {
ret = SSL_read(ssl, buf, sizeof(buf));
if (ret < 0) {
perror("SSL_read");
break;
} else if (ret == 0) {
printf("connection closed by server\n");
break;
} else {
// 处理收到的数据
printf("received %d bytes: %.*s\n", ret, ret, buf);
// 发送应答数据
SSL_write(ssl, "ACK", 3);
}
}
}
}
// 关闭SSL连接
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
// 关闭socket
close(sockfd);
return 0;
}
```
这个示例代码中使用了select函数来等待可读数据,然后使用SSL_read函数读取SSL数据,如果有未处理的SSL数据,就使用ssl_pending函数来检测。如果读取成功,则对收到的数据进行处理,并使用SSL_write函数发送应答数据。如果发生错误,就退出循环并关闭SSL连接和socket。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)