tcp 非阻塞 接收函数
时间: 2024-02-23 12:28:37 浏览: 166
非阻塞式接收函数是指在没有数据到达时,该函数不会一直等待数据到达,而是立即返回,以便程序能够执行其他任务。在TCP编程中,常用的非阻塞式接收函数是recv()函数。
使用非阻塞式接收函数需要先将socket设置为非阻塞模式,可以通过fcntl或者ioctl函数设置。然后,在调用recv()函数时,如果没有数据到达,该函数会立即返回,并且返回值为-1,同时设置errno为EAGAIN或EWOULDBLOCK。如果有数据到达,recv()函数会返回接收到的字节数。
下面是一个使用非阻塞式接收函数的示例代码:
```c
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 将socket设置为非阻塞模式
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8888);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
char buf[1024];
int n = 0;
while (1) {
n = recv(sockfd, buf, sizeof(buf), 0);
if (n == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
// 没有数据到达,可以执行其他任务
// ...
} else {
// 接收错误,关闭socket并退出循环
close(sockfd);
break;
}
} else if (n == 0) {
// 对方关闭连接,关闭socket并退出循环
close(sockfd);
break;
} else {
// 接收到数据,处理数据
// ...
}
}
return 0;
}
```
阅读全文