Linux中使用recvfrom函数接收数据 (recvfrom函数 linux)
Linux是一个强大而灵活的操作系统,它具有许多不同的网络编程接口和API,以便开发者们能够轻松地构建稳健的网络应用程序。其中一个非常重要的API是recvfrom函数,它允许系统在网络上收到数据并读取这些数据。在这篇文章中,我们将深入了解如何在,并展示一些实际的示例。
recvfrom函数概述
recvfrom函数允许我们从网络套接字中接收数据,其使用如下:
int recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
其中,sockfd是待接受数据的套接字描述符,buf是指接收数据的缓冲区,len是缓冲区的大小,flags是操作标志,src_addr是指向发送端套接字地址结构的指针,addrlen是指向发送端套接字地址结构长度的指针。
recvfrom函数返回已接收到的字节数,如果失败,则返回-1。
如何使用recvfrom函数接收数据?
下面是一些在的示例:
1. 接收UDP报文
在使用UDP协议进行通信时,我们可以使用recvfrom函数来接收UDP数据报文。下面是一个简单的示例代码:
“`
#include
#include
#include
#include
#define PORT 8080
int mn() {
int udp_socket, n;
char buffer[1024];
struct sockaddr_in server_address, client_address;
socklen_t addr_length = sizeof(client_address);
// 创建UDP套接字
if ((udp_socket = socket(AF_INET, SOCK_DGRAM, 0))
perror(“socket creation fled”);
return 1;
}
memset(&server_address, 0, sizeof(server_address));
memset(&client_address, 0, sizeof(client_address));
// 为服务器配置地址结构
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(PORT);
// 将套接字绑定到服务器地址
if (bind(udp_socket, (const struct sockaddr *)&server_address, sizeof(server_address))
perror(“bind fled”);
return 1;
}
printf(“Listening on port %d…\n”, PORT);
while (1) {
// 接收UDP数据报文
n = recvfrom(udp_socket, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_address, &addr_length);
printf(“Received from %s:%d:\n”, inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port));
printf(“%s”, buffer);
memset(&buffer, 0, sizeof(buffer));
}
close(udp_socket);
return 0;
}
“`
该代码从指定的端口(端口号为8080)接收UDP数据报文,并输出发送方的IP地址和端口号。
2. 接收TCP流
在使用TCP协议进行通信时,我们可以使用接收函数recv(accept函数已在之前调用完成)和非阻塞接收函数recvfrom。下面是一个简单的示例代码:
“`
#include
#include
#include
#include
#define PORT 8080
int mn() {
int tcp_socket, new_socket, n;
char buffer[1024];
struct sockaddr_in server_address, client_address;
socklen_t addr_length = sizeof(client_address);
// 创建TCP套接字
if ((tcp_socket = socket(AF_INET, SOCK_STREAM, 0))
perror(“socket creation fled”);
return 1;
}
memset(&server_address, 0, sizeof(server_address));
memset(&client_address, 0, sizeof(client_address));
// 为服务器配置地址结构
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(PORT);
// 将套接字绑定到服务器地址
if (bind(tcp_socket, (const struct sockaddr *)&server_address, sizeof(server_address))
perror(“bind fled”);
return 1;
}
// 开始监听请求
if (listen(tcp_socket, 3)
perror(“listen”);
return 1;
}
printf(“Wting for connections on port %d…\n”, PORT);
// 接收TCP流
new_socket = accept(tcp_socket, (struct sockaddr *)&client_address, &addr_length);
while (1) {
n = recv(new_socket, buffer, sizeof(buffer), 0);
printf(“Received from %s:%d:\n”, inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port));
printf(“%s”, buffer);
memset(&buffer, 0, sizeof(buffer));
}
close(tcp_socket);
return 0;
}
“`
该代码在接受TCP连接之后,接收从客户端发送过来的流,直到连接关闭。