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连接之后,接收从客户端发送过来的流,直到连接关闭。


数据运维技术 » Linux中使用recvfrom函数接收数据 (recvfrom函数 linux)