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日

相关文章

  • C语言中实现itoa函数的实例

    C语言中实现itoa函数的实例 什么是itoa函数? itoa函数是C++的标准库函数,可以将整型数据转换成对应的字符串。但在C中并没有该函数,为了方便C程序员的编程,我们需要自己实现该函数。 实现itoa函数的过程 实现itoa函数主要包括以下几个步骤: 判断待转换的整数是否为负数,如果是负数,则需要在最终的字符串前面添加负号。 将整型数按位分解,得到每个…

    C 2023年5月23日
    00
  • C语言中%d和%i格式说明符的区别

    下面是详细讲解“C语言中%d和%i格式说明符的区别”的完整使用攻略。 在C语言中,%d和%i两个格式说明符都是用来输出整数类型的变量的,但是它们有一些细微的区别。 区别一:进制数的输出 %d格式说明符会将输出的整数按照10进制输出,而%i格式说明符则会根据整数变量的前缀来输出对应的进制数。 举个例子,假设有一个十六进制的整数变量x,值为0x1F,使用%d和%…

    C 2023年5月10日
    00
  • Terry七月Ruby读书笔记(比较详细)第1/4页

    “Terry七月Ruby读书笔记(比较详细)第1/4页”攻略 1. 简介 “Terry七月Ruby读书笔记(比较详细)第1/4页”是一篇介绍Ruby编程语言的文章,主要分为四个部分,该攻略针对该文章第1/4页的内容进行详细讲解和分析。 2. 内容概述 在该笔记中,作者主要介绍了Ruby的基本数据类型和运算符。其中,介绍了Ruby的数字类型、字符串类型、布尔类…

    C 2023年5月23日
    00
  • C语言中如何进行算法优化?

    C语言算法优化攻略 1. 使用基本数据类型 在编写C语言算法时,应尽可能使用基本数据类型,避免使用浮点数和双精度浮点数,因为基本数据类型的处理速度更快。例如,可以使用整数代替小数进行计算,使用位运算代替乘除法等。 2. 减少循环嵌套 循环嵌套是C语言中实现算法的基础,但也是最容易导致程序性能瓶颈的地方。因此,在编写算法时应尽可能减少循环嵌套,避免不必要的复杂…

    C 2023年4月27日
    00
  • Win10预览版19042升级后浏览器网页异常内容显示不全怎么办?

    对于Win10预览版19042升级后浏览器网页异常内容显示不全的情况,可能是因为升级过程中出现了一些问题导致系统出现了一些错误,或者是因为浏览器插件以及设置的问题所导致的。以下是处理该问题的完整攻略。 步骤一:更新浏览器插件 第一步需要检查浏览器是否有最新版本的插件可用,如果有,则需要更新插件以解决可能出现的兼容性问题。比如,用户在使用谷歌浏览器时,可以按照…

    C 2023年5月23日
    00
  • jupyter notebook的安装与使用详解

    Jupyter Notebook的安装与使用 什么是Jupyter Notebook? Jupyter Notebook是一款基于Web的交互式计算环境,能够在浏览器中以交互式的形式编写和运行代码,并且可以在文档中穿插富媒体内容。 安装Jupyter Notebook 安装Jupyter Notebook需要先安装Python。以Windows系统为例,以下…

    C 2023年5月23日
    00
  • IOS Object-C 中Runtime详解及实例代码

    iOS Object-C 中Runtime详解及实例代码 1. Runtime简介 Runtime是OC的运行时系统。是一个由 C 语言编写的 底层的 Objective-C 对象(如实例和 Class)的管理系统。它是编译器和 CPU 的桥梁, Objective-C 的“动态”本质得以实现。 通过运行时机制,Objective-C能够实现动态绑定和方法调…

    C 2023年5月22日
    00
  • C语言程序环境编译+链接理论

    C语言程序的编译与链接是程序开发的重要环节之一,理解这一过程对于程序员来说是至关重要的。下面是一个完整攻略,分为以下几个步骤: 步骤一:编辑程序 在开始编译和链接之前,我们需要先编写C语言程序。这一步通常通过文本编辑器,如vscode、sublime等完成。我们以Hello World程序为例,来说明这一步。 #include <stdio.h>…

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