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地址、端口号、数据长度以及数据内容。以下是对代码的详细解读:

  1. 引入必要的头文件:

    • stdio.h:标准输入输出库。
    • sys/socket.h:提供套接字函数的定义。
    • netinet/in.h:定义了 IP 地址结构 sockaddr_in 等。
    • string.h:提供字符串处理函数的定义。
    • arpa/inet.h:提供了一些 IP 地址转换函数的定义。
    • unistd.h:提供了一些系统调用函数的定义。
  2. 在 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地址、端口号、数据长度以及数据内容。
      • 关闭套接字并退出程序。
  3. 解析接收到的数据:

    • 接收到的数据存储在 buf1 中,数据的长度为 len
    • 使用 inet_ntop 函数将发送者的IP地址转换为字符串形式,存储在 ip_str 中。
    • 使用 ntohs 函数将端口号转换为主机字节序,并存储在 port 中。
  4. 打印接收到的信息:

    • 使用 printf 函数输出发送者的IP地址、端口号、数据长度以及数据内容。
  5. 关闭套接字并退出程序:

    • 在循环中,每次接收完数据后立即关闭套接字并返回,这会导致程序只能接收一次数据就退出。如果希望持续接收数据,需要将关闭套接字的部分移出循环。

总结:

  • 该程序是一个简单的UDP服务器,实现了接收来自客户端的数据并输出发送者的IP地址、端口号、数据长度以及数据内容的功能。
  • 如果需要持续接收数据,可以将关闭套接字的部分移到循环外,并添加适当的逻辑以维持服务器的运行。

相关推荐

  1. LINUX网络编程UDP程序recvfrom接收数据

    2024-04-14 19:28:04       15 阅读
  2. linux网络----UDP编程

    2024-04-14 19:28:04       35 阅读
  3. LINUX网络编程UDP程序绑定发送主机IP及端口

    2024-04-14 19:28:04       12 阅读
  4. QT网络编程之实现UDP广播发送和接收

    2024-04-14 19:28:04       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-14 19:28:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-14 19:28:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-14 19:28:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-14 19:28:04       18 阅读

热门阅读

  1. elasticsearch不删除索引只清理数据——筑梦之路

    2024-04-14 19:28:04       14 阅读
  2. 【2024】elasticsearch的安装及使用建议

    2024-04-14 19:28:04       19 阅读
  3. 【React Router】初识路由(中)

    2024-04-14 19:28:04       15 阅读
  4. Verilog语法回顾--case语句

    2024-04-14 19:28:04       18 阅读
  5. go标准库和第三方库使用

    2024-04-14 19:28:04       15 阅读
  6. 华纳云:如何选择适合自己需求的备份服务器?

    2024-04-14 19:28:04       17 阅读
  7. Modbus-RTU通讯协议

    2024-04-14 19:28:04       14 阅读
  8. Internet Download Manager(IDM):提升下载效率的神器

    2024-04-14 19:28:04       27 阅读
  9. 2024-4-14关于闭包的理解

    2024-04-14 19:28:04       12 阅读
  10. 线程池的参数 以及实现

    2024-04-14 19:28:04       14 阅读