详解C语言使用SOCKET发送UDP消息

news/2024/5/18 13:38:56 标签: c语言, udp, 开发语言

当涉及到网络通信时,UDP(用户数据报协议)是一种常见且重要的协议。它被广泛用于实时数据传输,如音视频流和游戏数据。在本篇博客文章中,我将向您展示如何使用C语言编写一个简单的UDP消息发送程序。

首先,我们需要引入一些头文件来支持网络编程。以下是您需要的头文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

接下来,我们需要定义一些常量和变量。其中,我们需要指定目标主机的IP地址和端口号,以及发送的消息内容。

#define TARGET_IP "127.0.0.1"  // 目标主机的IP地址
#define TARGET_PORT 12345     // 目标主机的端口号
#define MESSAGE "Hello UDP!"  // 发送的消息内容

现在,我们可以编写main函数了。在函数中,我们首先需要创建一个UDP socket,并进行一些错误检查。

int main() {
    int sockfd; // Socket 描述符
    struct sockaddr_in target_addr; // 目标主机地址

    // 创建 UDP socket
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

我们使用socket函数来创建一个IPv4的UDP socket,并将返回的描述符存储在sockfd变量中。如果socket创建失败,我们将输出错误消息并退出程序。

接下来,我们需要填充目标主机的地址信息,并将其存储在target_addr结构体中。

    // 设置目标主机的地址信息
    memset(&target_addr, 0, sizeof(target_addr));
    target_addr.sin_family = AF_INET; // IPv4
    target_addr.sin_port = htons(TARGET_PORT); // 目标主机的端口号
    target_addr.sin_addr.s_addr = inet_addr(TARGET_IP); // 目标主机的IP地址

在这里,memset函数用于初始化target_addr结构体。我们将其地址族设置为IPv4(AF_INET),并使用htons函数将目标主机的端口号转换为网络字节序。最后,inet_addr函数将字符串形式的IP地址转换为二进制格式,并将其存储在sin_addr.s_addr字段。

现在,我们可以使用sendto函数发送UDP消息了。

    // 发送 UDP 消息
    if (sendto(sockfd, (const char *)MESSAGE, strlen(MESSAGE), 0, (const struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) {
        perror("sendto failed");
        exit(EXIT_FAILURE);
    }

    printf("Message sent successfully.\n");

    close(sockfd);

    return 0;
}

sendto函数用于将UDP消息发送到目标主机。它接受参数包括:socket描述符,消息内容,消息长度,标志,目标主机地址和地址长度。如果发送失败,我们将输出错误消息并退出程序。

最后,我们关闭socket并返回0以结束程序。

这就是一个简单的使用C语言发送UDP消息的程序示例。您可以根据自己的需要进行进一步的优化和扩展。希望这篇文章对您有所帮助!如有任何疑问,请随时提问。


http://www.niftyadmin.cn/n/4928247.html

相关文章

浅谈可持久化

浅谈可持久化 可持久化权值线段树 例题 ​ 可持久化意味着在某次操作时&#xff0c;可以操作历史版本的结构&#xff0c;支持回退历史的功能。在权值线段树中&#xff0c;不需要知道某个数具体是多少&#xff0c;只需要保留数与数之间的相对大小关系&#xff0c;这就涉及到离…

主题模型分析-【LDA】

主题模型能够自动将文本语料库编码为一组具有实质性意义的类别。这些类别称为主题。 主题模型分析的典型代表就是本篇文章将要介绍的隐含迪利克雷分布&#xff0c;也就是LDA。 假设我们有一个文档或者新闻的集合&#xff0c;我们想将他们分类为主题。 我们设置好主题数量后&am…

Fabric系列 - 知识点整理

知识点 源码编译 主机编译 容器编译 手动部署(docker-compose) 单peer 多peer 中途加peer 多主机多peer 链码 语法, 接口 (go版) 命令行调用 ca server 在DApp中使用SDK调用 (js版) 部署的几个阶段 部署1排序和1节点, 1组织1通道 光部署能Dapp 带ca server (每个组织一个)…

Gitlab CI/CD笔记-第二天-使用maven打包并且使用主机套接字进行构建并push镜像。

一、安装gitlab-runner 1.可以是linux也可以是docker的 2.本文说的是docker安装部署的。 二、直接上.gitlab-ci.yml stages: # List of stages for jobs, and their order of execution - build-image build-image-job: stage: build-image image: harbor.com:543/docke…

flutter引入高德地图,release 版本闪退问题解决

前提是在确定了闪退是由于地图引起的之后。报错内容如下 1、检查高德开放平台&#xff0c;查看参数是否正确配置&#xff0c;SHA1 和包名是否正确。配置 SHA1 可参考获取 Android 的 SHA1 值_LoveShadowing的博客-CSDN博客 2、检查是否引入 sdk&#xff0c;是否配置混淆&#…

springboot 配置文件优先级

简介 springboot配置文件可以使用properties、yaml&#xff0c;一个系统中最好只使用一种格式&#xff0c;如果在同一个位置使用了properties、yaml&#xff0c;那么properties会覆盖yaml&#xff0c;个人推荐使用yaml&#xff0c;支持结构化&#xff0c;层次更清晰。 详情 …

AppZygote是什么?

众所周知&#xff0c;app进程、SystemServer进程都是由Zygote进程孵化的&#xff0c;最近梳理这块逻辑的时候&#xff0c;无意中发现了一个叫AppZygote和一个叫AppZygoteInit的java类&#xff0c;挺新鲜的&#xff0c;先看看源码开头对AppZygote的定义吧&#xff1a; AppZygot…

在编程下仰望

编程的尽头是数学 数学的尽头是物理 物理的尽头是哲学 哲学的尽头是耶稣 路漫漫其修远兮&#xff0c; 各位码农同仁 好自珍重