C语言UDP传输系统源码

首先,需要明确的是UDP(User Datagram Protocol)是一种连接不稳定、数据包传输的协议。C语言主要通过socket编程实现UDP传输系统。

以下是实现UDP传输系统的基本步骤:

1.初始化socket,并指定协议为UDP:

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

其中,AF_INET表示IPv4地址族,SOCK_DGRAM表示使用UDP协议传输。

2.绑定服务器地址和端口:

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);  // 端口号
inet_aton("127.0.0.1", &(server_addr.sin_addr));  // IP地址
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

3.接收客户端的数据包:

char buffer[MAX_BUFFER_SIZE];
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
recvfrom(sockfd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len);

其中,MAX_BUFFER_SIZE为接收缓冲区的大小。

4.发送数据到客户端:

sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&client_addr, addr_len);

至此,UDP传输系统的基本框架就已经实现了。下面给出两个示例:

示例一:UDP传输文本消息

服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 8080
#define MAX_BUFFER_SIZE 1024

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    inet_aton("127.0.0.1", &(server_addr.sin_addr));
    bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

    char buffer[MAX_BUFFER_SIZE];
    struct sockaddr_in client_addr;
    socklen_t addr_len = sizeof(client_addr);
    recvfrom(sockfd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len);

    printf("收到客户端消息:%s\n", buffer);

    sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&client_addr, addr_len);

    return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 8080
#define MAX_BUFFER_SIZE 1024

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    inet_aton("127.0.0.1", &(server_addr.sin_addr));

    char buffer[MAX_BUFFER_SIZE];
    printf("请输入你要发送的消息:");
    fgets(buffer, MAX_BUFFER_SIZE, stdin);

    sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));

    struct sockaddr_in recv_addr;
    socklen_t addr_len = sizeof(recv_addr);
    recvfrom(sockfd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *)&recv_addr, &addr_len);

    printf("收到服务器消息:%s", buffer);

    return 0;
}

以上代码实现了客户端向服务器发送一条文本消息,服务器收到后将消息返回给客户端。

示例二:UDP传输文件

服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 8080
#define MAX_BUFFER_SIZE 1024

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    inet_aton("127.0.0.1", &(server_addr.sin_addr));
    bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

    FILE *fp = fopen("test.txt", "wb");
    if (!fp)
    {
        fprintf(stderr, "打开文件失败!\n");
        exit(1);
    }

    char buffer[MAX_BUFFER_SIZE];
    struct sockaddr_in client_addr;
    socklen_t addr_len = sizeof(client_addr);
    int len = 0;
    while ((len = recvfrom(sockfd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len)) > 0)
    {
        fwrite(buffer, 1, len, fp);
    }

    fclose(fp);

    return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 8080
#define MAX_BUFFER_SIZE 1024

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    inet_aton("127.0.0.1", &(server_addr.sin_addr));

    FILE *fp = fopen("test.txt", "rb");
    if (!fp)
    {
        fprintf(stderr, "打开文件失败!\n");
        exit(1);
    }

    char buffer[MAX_BUFFER_SIZE];
    int len = 0;
    while ((len = fread(buffer, 1, MAX_BUFFER_SIZE, fp)) > 0)
    {
        sendto(sockfd, buffer, len, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
        usleep(100);  // 等待0.1秒,避免数据包丢失
    }

    fclose(fp);

    return 0;
}

以上代码实现了客户端将文件“test.txt”发送给服务器,服务器接收到后保存在本地。注意,由于UDP协议的不可靠性,需要在发送数据包后等待一段时间,避免数据包丢失。

以上就是C语言UDP传输系统的基本攻略,希望能对你有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言UDP传输系统源码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 浅析ARM架构下的函数的调用过程

    浅析ARM架构下的函数的调用过程 ARM函数调用基本流程 ARM函数调用的基本流程如下: 调用者保存寄存器(Callee saved registers):在调用函数之前,调用者需要保存被调用者需要用到的寄存器,否则这些值会被调用函数所覆盖,导致逻辑错误。在ARM架构中,callee saved registers 都是 r4-r11,他们将被保存在当前堆栈…

    C 2023年5月23日
    00
  • 学生成绩管理系统C语言代码实现

    学生成绩管理系统是一个非常典型的C语言应用程序,下面将逐步讲解该系统的完整实现过程。 系统需求分析 首先,我们需要根据需求分析设计系统的功能和流程。在这个例子中,学生成绩管理系统简要需要实现以下功能: 管理员可以输入多个学生的基本信息,包括姓名、学号、班级等。 管理员可以为每个学生输入多门学科的成绩。 管理员可以查看每个学生的平均成绩和总分数,并且可以查看学…

    C 2023年5月23日
    00
  • C++读写Excel的实现方法详解

    下面是详细讲解“C++读写Excel的实现方法详解”的攻略。 C++读写Excel的实现方法详解 前言 本文介绍如何使用C++语言,读写Excel表格文件。主要介绍了两种方法:使用MFC库和使用第三方库libxl。首先需要了解Excel的文件格式。Excel文件的拓展名一般为“.xls”或“.xlsx”,是一种二进制文件,里面包含了Excel表格的行列、样式…

    C 2023年5月23日
    00
  • C++回溯算法深度优先搜索举例分析

    当需要在一个问题的所有解中搜索特定解时,可以使用回溯算法。在搜索过程中,如果到达一个点不能通过它继续搜索了,回溯算法会回溯到上一个点继续搜索。 深度优先搜索是回溯算法的一种形式。在深度优先搜索中,我们尽可能深地搜索一个解的分支,如果达到一个结束点或无法进一步搜索,则回溯回到上一个状态并继续搜索其他分支。 在使用回溯算法解决问题时,首先必须明确问题的解空间。然…

    C 2023年5月22日
    00
  • 详解C语言实现猜数字游戏

    详解C语言实现猜数字游戏攻略 1. 猜数字游戏概述 对于猜数字游戏,通常来说,玩家会有一定的次数来猜测一个数字,如果猜对了,则游戏胜利;否则,游戏失败。在实现这个游戏的时候,我们需要完成以下几个步骤: 生成一个随机数字 让玩家进行猜测 判断猜测是否正确 根据判断结果输出信息 循环执行步骤2到4,直到达到游戏次数上限或者玩家获胜 在下面的部分中,我们将详细讲解…

    C 2023年5月22日
    00
  • Java内部类和异常类的概念以及使用

    Java内部类(Inner Class)是定义在其他类中的类。内部类具有比普通类更多的访问权限,可以访问其外部类的私有属性和方法。Java内部类可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。 举个例子:假设有一个外部类叫做OuterClass,它有一个私有属性叫做privateVar,内部类叫做InnerClass。下面是一个成员内部类的…

    C 2023年5月23日
    00
  • 实例详解Android中JNI的使用方法

    实例详解Android中JNI的使用方法 在 Android 应用中,如果需要使用一些 C/C++ 的库或代码,就需要使用 JNI 技术来调用。本文将介绍在 Android 中如何使用 JNI。 1. 环境准备 首先,需要下载 JNI 开发环境,并配置好环境变量。可以在官网下载 NDK,解压缩后配置环境变量: export PATH=$PATH:/path/…

    C 2023年5月23日
    00
  • js解析json读取List中的实体对象示例

    下面是“js解析json读取List中的实体对象示例”的完整攻略。 1. 什么是 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,常用于 Web 应用程序之间的数据传输。 JSON 数据是由键值对组成,键名必须是双引号包裹的字符串,键值可以是数字、字符串、布尔值、数组、对象等一些基本的数据类型。示例代码…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部