. 套接字默认创建时是工作在什么模式下?有哪些方法能将套接字从阻寒 模式变为非阻塞模式
时间: 2023-11-29 13:04:22 浏览: 82
C#中的套接字编程实例1.doc
套接字默认创建时是以阻塞模式(blocking mode)工作的。
要将套接字从阻塞模式变为非阻塞模式,可以使用以下两种方法:
1. 使用 fcntl 函数
可以使用 fcntl 函数的 F_SETFL 命令将套接字的文件描述符设置为非阻塞模式,示例代码如下:
```c
#include <fcntl.h>
...
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
```
2. 使用 ioctl 函数
可以使用 ioctl 函数的 FIONBIO 命令将套接字的文件描述符设置为非阻塞模式,示例代码如下:
```c
#include <sys/ioctl.h>
...
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
int on = 1;
ioctl(sockfd, FIONBIO, &on);
```
需要注意的是,在非阻塞模式下,如果使用阻塞式的函数(如 recv、send、accept 等)进行数据传输,这些函数将会立即返回,不会等待数据传输完成。因此,在使用非阻塞模式时,需要使用 select、poll、epoll 等函数进行事件驱动。
阅读全文