LINUX【网络编程】UDP程序recvfrom接收数据

2024-04-14 13:20

本文主要是介绍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地址、端口号、数据长度以及数据内容的功能。
  • 如果需要持续接收数据,可以将关闭套接字的部分移到循环外,并添加适当的逻辑以维持服务器的运行。

这篇关于LINUX【网络编程】UDP程序recvfrom接收数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903100

相关文章

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提