Linux 编程中常用的 recvfrom 函数详解 (recvfrom linux)
在Linux操作系统中,网络编程是非常重要的一部分。而网络编程中,数据的传输和接收是必不可少的。在Linux编程中,接收数据时通常会使用到 recvfrom 函数。本文将详细讲解 Linux 编程中 recvfrom 函数的定义、用法以及注意事项。
一、recvfrom 函数的定义
recvfrom 函数是 Linux 中的系统调用函数,主要用于接收数据。该函数的定义如下:
“`c
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
“`
其中,各个参数的含义如下:
– sockfd:表示接收数据的套接字描述符;
– buf:表示接收数据的缓冲区;
– len:表示接收数据的缓冲区的长度;
– flags:表示接收数据时的额外选项;
– src_addr:源地址信息;
– addrlen:源地址信息的长度。
该函数的返回值为 ssize_t,表示成功接收到的数据长度。如果返回-1,则表示出现错误。此时可以通过 perror 函数打印错误信息,以便进行调试。
二、recvfrom 函数的用法
在使用 recvfrom 函数时,我们需要先创建一个 socket 套接字,并将其绑定到一个 IP 地址和端口号上。接下来,我们就可以使用 recvfrom 函数来接收数据了。具体的代码如下所示:
“`c
#include
#include
#include
#include
#include
#include
#include
#define PORT 8888
#define MAXLINE 1024
int mn(int argc, char *argv[])
{
int sockfd;
char buffer[MAXLINE];
struct sockaddr_in servaddr, cliaddr;
// 创建 socket 套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror(“socket creation fled”);
exit(EXIT_FLURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
// 初始化服务器地址结构
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
// 绑定服务器地址结构到 socket 套接字上
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
perror(“bind fled”);
exit(EXIT_FLURE);
}
printf(“Server listening on port %d\n”, PORT);
// 接收数据
while (1) {
socklen_t len = sizeof(cliaddr);
ssize_t n = recvfrom(sockfd, buffer, MAXLINE, 0, (struct sockaddr *)&cliaddr, &len);
if (n == -1) {
perror(“recvfrom error”);
exit(EXIT_FLURE);
}
buffer[n] = ‘\0’;
printf(“Received message from client: %s\n”, buffer);
// 向客户端发送数据
int ret = sendto(sockfd, (const char *)buffer, strlen(buffer), 0, (const struct sockaddr *)&cliaddr, len);
if (ret == -1) {
perror(“sendto error”);
exit(EXIT_FLURE);
}
printf(“Message sent to client: %s\n”, buffer);
}
close(sockfd);
return 0;
}
“`
该程序首先创建了一个 UDP 套接字,并将其绑定到 localhost:8888 这个地址上。然后,通过一个 while 循环持续监听是否有数据发送过来。如果接收到了数据,就将其打印出来,并向客户端发送一条相同的消息。
三、recvfrom 函数的注意事项
在使用 recvfrom 函数时,需要注意以下几点:
1. 如果缓冲区大小小于接收到的数据大小,那么函数会将缓冲区填满,并且截断那些超过缓冲区的部分;
2. 如果设置了 MSG_PEEK 标志,那么 recvfrom 函数只是读取数据,并不会将数据从输入队列中移除;
3. 如果设置了 MSG_DONTWT 标志,那么 recvfrom 函数将不会阻塞,即使没有数据可读,它也会立即返回;
4. 当通过 sendto 函数向远程主机发送数据时,需要注意参数的正确性,否则会出现数据发送失败的情况。