recv非阻塞,用C语言写出程序
时间: 2024-03-01 18:53:30 浏览: 108
C语言编程指导
下面是一个简单的C语言程序,使用非阻塞模式进行recv操作:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <errno.h>
int main() {
int sock;
struct sockaddr_in server_addr;
char buffer[1024];
int bytes_received;
int flags;
// 创建socket
sock = socket(AF_INET, SOCK_STREAM, 0);
// 设置socket为非阻塞模式
flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);
// 连接服务器
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
// 循环读取数据
while (1) {
bytes_received = recv(sock, buffer, sizeof(buffer), 0);
if (bytes_received == -1) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
// 没有数据可读,继续循环
continue;
} else {
// 其他错误,退出循环
perror("recv error");
break;
}
} else if (bytes_received == 0) {
// 连接关闭,退出循环
printf("connection closed by peer\n");
break;
} else {
// 成功读取数据,处理数据
buffer[bytes_received] = '\0';
printf("received: %s\n", buffer);
}
}
// 关闭socket
close(sock);
return 0;
}
```
该程序使用了fcntl函数将socket设置为非阻塞模式,然后循环调用recv函数读取数据。如果recv返回EWOULDBLOCK或者EAGAIN错误码,说明当前没有数据可读,需要继续循环。如果recv返回其他错误码,或者返回0表示连接关闭,就退出循环。如果成功读取到数据,就处理数据并继续循环。
阅读全文