本文主要是介绍LINUX【网络编程】UDP程序recvfrom接收数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一,代码
#include <stdio.h>
#include <sys/socket.h> //socket函数
#include <netinet/in.h> //struct sockaddr_in结构体
#include <string.h> //memset跟strlen
#include <arpa/inet.h> //bind函数
#include <unistd.h> //close函数
int main(int argc, const char *argv[])
{
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // include<sys/socket.h>
if (sockfd < 0)
{
perror("socket");
return 0;
}
struct sockaddr_in my_addr; // #include<netinet/in.h>
memset(&my_addr, 0, sizeof(my_addr)); // 初始化
my_addr.sin_family = AF_INET; // IPV4
my_addr.sin_port = htons(9000); // 端口号
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 通配地址,发送者主机地址
int ret = bind(sockfd, (const struct sockaddr *)&my_addr, sizeof(my_addr));
if (ret < 0)
{
perror("bind");
return 0;
}
// recvfrom接收数据
while (1)
{
unsigned char buf1[1500] = ""; // 最大1500
struct sockaddr_in from_addr;
socklen_t from_len = sizeof(from_addr);
int len = recvfrom(sockfd, buf1, sizeof(buf1), 0, (struct sockaddr *)&from_addr, &from_len);
if (len < 0)
{
perror("recvfrom");
return 0;
}
char ip_str[16] = "";
inet_ntop(AF_INET, &from_addr.sin_addr.s_addr, ip_str, 16); // 获取发送者的IP
unsigned short port = ntohs(from_addr.sin_port);
printf("TP:%s PORT:%hu 长度:%d 消息:%s\n", ip_str, port, len, buf1);
close(sockfd);
return 0;
}
}
二,详细解读
此代码是一个简单的UDP服务器程序,用于接收来自客户端的数据并输出发送者的IP地址、端口号、数据长度以及数据内容。以下是对代码的详细解读:
-
引入必要的头文件:
stdio.h
:标准输入输出库。sys/socket.h
:提供套接字函数的定义。netinet/in.h
:定义了 IP 地址结构sockaddr_in
等。string.h
:提供字符串处理函数的定义。arpa/inet.h
:提供了一些 IP 地址转换函数的定义。unistd.h
:提供了一些系统调用函数的定义。
-
在
main
函数中:-
创建一个 UDP 套接字:
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
。- 使用
socket
函数创建一个基于 IPv4 的 UDP 套接字。 - 如果创建失败,会输出错误信息并返回。
- 使用
-
定义并初始化服务器的地址结构体
my_addr
,并将套接字绑定到该地址:struct sockaddr_in my_addr; memset(&my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(9000); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); int ret = bind(sockfd, (const struct sockaddr *)&my_addr, sizeof(my_addr));
- 如果绑定失败,会输出错误信息并返回。
-
在一个无限循环中接收数据并处理:
- 使用
recvfrom
函数接收数据,并获取发送者的地址信息。 - 将发送者的IP地址转换为字符串形式。
- 打印发送者的IP地址、端口号、数据长度以及数据内容。
- 关闭套接字并退出程序。
- 使用
-
-
解析接收到的数据:
- 接收到的数据存储在
buf1
中,数据的长度为len
。 - 使用
inet_ntop
函数将发送者的IP地址转换为字符串形式,存储在ip_str
中。 - 使用
ntohs
函数将端口号转换为主机字节序,并存储在port
中。
- 接收到的数据存储在
-
打印接收到的信息:
- 使用
printf
函数输出发送者的IP地址、端口号、数据长度以及数据内容。
- 使用
-
关闭套接字并退出程序:
- 在循环中,每次接收完数据后立即关闭套接字并返回,这会导致程序只能接收一次数据就退出。如果希望持续接收数据,需要将关闭套接字的部分移出循环。
总结:
- 该程序是一个简单的UDP服务器,实现了接收来自客户端的数据并输出发送者的IP地址、端口号、数据长度以及数据内容的功能。
- 如果需要持续接收数据,可以将关闭套接字的部分移到循环外,并添加适当的逻辑以维持服务器的运行。
这篇关于LINUX【网络编程】UDP程序recvfrom接收数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!