c语言编程笔录

首页 >   > 笔记大全

笔记大全

c语言udp实现上传下载

更新时间:2024-01-22

前言

本文将介绍如何使用C语言实现UDP协议来实现上传和下载功能。UDP是一种面向无连接的传输协议,它在网络通信中具有较低的开销和较高的传输效率。通过使用UDP,我们可以在客户端和服务器之间快速传输文件。

实现上传功能

要实现上传功能,我们需要先在服务器端创建一个UDP套接字,并绑定到一个指定的端口上。客户端通过创建一个UDP套接字,并将文件数据通过套接字发送到服务器端。服务器端接收到数据后,将数据写入指定的文件中。

// 服务器端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 9000
#define MAX_BUFFER_SIZE 1024

int main() {
    int sockfd, ret;
    struct sockaddr_in serverAddr;
    char buffer[MAX_BUFFER_SIZE];

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        printf("Error in socket creation.\n");
        exit(1);
    }
    
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = INADDR_ANY;

    ret = bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
    if (ret < 0) {
        printf("Error in binding.\n");
        exit(1);
    }

    while (1) {
        memset(buffer, 0, sizeof(buffer));
        ret = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);
        if (ret < 0) {
            printf("Error in receiving data.\n");
            exit(1);
        }
        FILE *file;
        file = fopen("received_file.txt", "a");
        if (file == NULL) {
            printf("Error in opening file.\n");
            exit(1);
        }
        fprintf(file, "%s", buffer);
        fclose(file);
        printf("File received and saved successfully!\n");
    }

    return 0;
}

服务器端代码中,我们先创建一个UDP套接字,并绑定到指定的端口上。然后使用recvfrom函数接收从客户端发送过来的数据,并将数据写入到一个指定的文件中。这样,当客户端向服务器发送文件数据时,服务器会不断接收并保存数据。

实现下载功能

要实现下载功能,客户端需要向服务器发送请求,并指定要下载的文件名。服务器在接收到请求后,将对应的文件数据发送给客户端。客户端接收到数据后,将数据写入本地文件中。

// 客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 9000
#define MAX_BUFFER_SIZE 1024

int main() {
    int sockfd, ret;
    struct sockaddr_in serverAddr;
    char buffer[MAX_BUFFER_SIZE];
    char fileName[MAX_BUFFER_SIZE];

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        printf("Error in socket creation.\n");
        exit(1);
    }
    
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = INADDR_ANY;

    printf("Enter the name of the file to download: ");
    scanf("%s", fileName);

    ret = sendto(sockfd, fileName, strlen(fileName), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
    if (ret < 0) {
        printf("Error in sending request.\n");
        exit(1);
    }

    FILE *file;
    file = fopen(fileName, "w");
    if (file == NULL) {
        printf("Error in creating file.\n");
        exit(1);
    }

    memset(buffer, 0, sizeof(buffer));
    while ((ret = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL)) > 0) {
        fprintf(file, "%s", buffer);
        memset(buffer, 0, sizeof(buffer));
    }
    fclose(file);
    printf("File downloaded successfully!\n");

    return 0;
}

客户端代码中,我们先创建一个UDP套接字,并向服务器发送请求,要求下载指定文件。然后使用recvfrom函数接收从服务器发送过来的文件数据,并将数据写入到一个指定的本地文件中。这样,客户端就能从服务器端下载指定文件。

总结

通过使用C语言和UDP协议,我们可以实现上传和下载功能。在服务器端,创建一个UDP套接字并绑定到指定的端口上,接收从客户端传输过来的数据,并将数据写入到指定的文件中。在客户端,创建一个UDP套接字并向服务器发送请求,接收从服务器传输过来的文件数据,并将数据写入到本地文件中。

需要注意的是,在实际开发中,还需要对错误进行适当的处理,并进行数据校验和完整性检查,以确保传输的文件准确无误。此外,还可以进一步优化代码,提高性能和可靠性。