Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Chương trình C truyền file dùng UDP


Dữ liệu chuyển giữa hai máy tính dùng Socket programming trong C.

File có thể gửi dùng UDP (User Datagram Protocol) và client/server đơn giản.

Bảo mật: mã hóa XOR. Giao thức: UDP.

Thuật toán

  • Server khởi động, chờ tên file.
  • Client gửi tên file.
  • Server nhận tên file. Nếu file tồn tại, đọc file và gửi buffer đã mã hóa cho đến hết file (EOF).
  • EOF đánh dấu hết file.
  • Client nhận buffer cho đến EOF, sau đó giải mã.
  • Nếu file không tồn tại, gửi thông báo "file not found".

Server

// server code for UDP socket programming
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define IP_Protocol 0
#define Port_No 15050
#define Net_Buf_Size 32
#define CipherKey 'S'
#define SendRecvFlag 0
#define NoFile "File Not Found!"
void clearBuf(char* b1){
    int i;
    for (i = 0; i < Net_Buf_Size; i++)
        b1[i] = '\0';
}
char Cipher(char ch1){
    return ch1 ^ CipherKey;
}
int sendFile(FILE* fp1, char* buf1, int s1){
    int i, len;
    if (fp1 == NULL) {
        strcpy(buf1, NoFile);
        len = strlen(NoFile);
        buf1[len] = EOF;
        for (i = 0; i <= len; i++)
            buf1[i] = Cipher(buf1[i]);
        return 1;
    }
    char ch1, ch2;
    for (i = 0; i < s1; i++) {
        ch1 = fgetc(fp1);
        ch2 = Cipher(ch1);
        buf1[i] = ch2;
        if (ch1 == EOF)
            return 1;
    }
    return 0;
}
int main(){
    int sockfd1, nBytes;
    struct sockaddr_in addr_con;
    int addrlen = sizeof(addr_con);
    addr_con.sin_family = AF_INET;
    addr_con.sin_port = htons(Port_No);
    addr_con.sin_addr.s_addr = INADDR_ANY;
    char net_buf1[Net_Buf_Size];
    FILE* fp1;
    sockfd1 = socket(AF_INET, SOCK_DGRAM, IP_Protocol);
    if (sockfd1 < 0)
        printf("\nfile descriptor is not received!!\n");
    else
        printf("\nfile descriptor %d is received\n", sockfd1);
    if (bind(sockfd1, (struct sockaddr*)&addr_con, sizeof(addr_con)) == 0)
        printf("\nSuccessfully is binded!\n");
    else
        printf("\nBinding is Failed!\n");
    while (1) {
        printf("\nWaiting for name of file...\n");
        clearBuf(net_buf1);
        nBytes = recvfrom(sockfd1, net_buf1, Net_Buf_Size, SendRecvFlag, (struct sockaddr*)&addr_con, &addrlen);
        fp1 = fopen(net_buf1, "r");
        printf("\nFile Name is Received: %s\n", net_buf1);
        if (fp1 == NULL)
            printf("\nFile open is failed!\n");
        else
            printf("\nFile Successfully is opened!\n");
        while (1) {
            if (sendFile(fp1, net_buf1, Net_Buf_Size)) {
                sendto(sockfd1, net_buf1, Net_Buf_Size, SendRecvFlag, (struct sockaddr*)&addr_con, addrlen);
                break;
            }
            sendto(sockfd1, net_buf1, Net_Buf_Size, SendRecvFlag, (struct sockaddr*)&addr_con, addrlen);
            clearBuf(net_buf1);
        }
        if (fp1 != NULL)
            fclose(fp1);
    }
    return 0;
}

Client

// client code for UDP socket programming
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define IP_Protocol 0
#define IP_Address "127.0.0.1"
#define Port_No 15050
#define Net_Buf_Size 32
#define CipherKey 'S'
#define SendRecvFlag 0
void clearBuf(char* b1){
    int i;
    for (i = 0; i < Net_Buf_Size; i++)
        b1[i] = '\0';
}
char Cipher(char ch1){
    return ch1 ^ CipherKey;
}
int recvFile(char* buf1, int s1) {
    int i;
    char ch1;
    for (i = 0; i < s1; i++) {
        ch1 = buf1[i];
        ch1 = Cipher(ch1);
        if (ch1 == EOF)
            return 1;
        else
            printf("%c", ch1);
    }
    return 0;
}
int main(){
    int sockfd1, nBytes;
    struct sockaddr_in addr_con;
    int addrlen = sizeof(addr_con);
    addr_con.sin_family = AF_INET;
    addr_con.sin_port = htons(Port_No);
    addr_con.sin_addr.s_addr = inet_addr(IP_Address);
    char net_buf1[Net_Buf_Size];
    FILE* fp1;
    sockfd1 = socket(AF_INET, SOCK_DGRAM, IP_Protocol);
    if (sockfd1 < 0)
        printf("\nfile descriptor is not received!!\n");
    else
        printf("\nfile descriptor %d is received\n", sockfd1);
    while (1) {
        printf("\nPlease enter the name of file to receive:\n");
        scanf("%s", net_buf1);
        sendto(sockfd1, net_buf1, Net_Buf_Size, SendRecvFlag, (struct sockaddr*)&addr_con, addrlen);
        printf("\n---------Data is Received---------\n");
        while (1) {
            clearBuf(net_buf1);
            nBytes = recvfrom(sockfd1, net_buf1, Net_Buf_Size, SendRecvFlag, (struct sockaddr*)&addr_con, &addrlen);
            if (recvFile(net_buf1, Net_Buf_Size)) {
                break;
            }
        }
        printf("\n-------------------------------\n");
    }
    return 0;
}