首页 > 文章列表 > 使用UDP进行文件传输的C程序

使用UDP进行文件传输的C程序

-UDP文件传输 -C程序 -文件传输
188 2023-09-07

数据可以在两台使用 C 语言实现 Socket 编程的计算机之间传输。

在同样的情况下,可以轻松地通过实现用户数据报协议 (UDP) 和 简单的客户端/服务器。

安全性 - 通过加密处理。

协议 - UDP

加密 - 异或加密

算法

  • 服务器启动并等待文件名。

  • 客户端发送文件名。

  • 该文件名由服务器接收。如果文件存在,服务器开始读取文件,并继续发送一个填充有加密文件内容的缓冲区,直到到达文件末尾。

  • 文件结尾标记为EOF。

  • 文件将作为缓冲区接收,直到且除非收到 EOF。之后对其进行加密。

  • 如果文件不存在,则会发送一条消息“找不到文件”。

服务器

// server code for UDP socket programming
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define IP_Protocol 0
#define Port_No 15050
#define Net_Buf_Size 32
#define CipherKey 'S'
#define SendRecvFlag 0
#define NoFile "File Not Found!"
// function for clearing buffer
void clearBuf(char* b1){
   int i;
   for (i = 0; i < Net_Buf_Size; i++)
   b1[i] = '';
}
// function for encryption method
char Cipher(char ch1){
   return ch1 ^ CipherKey;
}
// function for sending file
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(fp);
      ch2 = Cipher(ch1);
      buf1[i] = ch2;
      if (ch1 == EOF)
      return 1;
   }
   return 0;
}
// driver code
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;
   // socket()
   sockfd1 = socket(AF_INET, SOCK_DGRAM, IP_Protocol);
   if (sockfd1 < 0)
      printf("

file descriptor is not received!!

");    else       printf("

file descriptor %d is received

", sockfd1);    // bind()    if (bind(sockfd1, (struct sockaddr*)&addr_con,       sizeof(addr_con)) == 0)       printf("

Successfully is binded!

");    else       printf("

Binding is Failed!

");    while (1) {       printf("

Waiting for name of file...

");       // receive name of file       clearBuf(net_buf1);       nBytes = recvfrom(sockfd1, net_buf1,       Net_Buf_Size, SendRecvFlag,       (struct sockaddr*)&addr_con,       &addrlen);       fp1 = fopen(net_buf1, "r");       printf("

File Name is Received: %s

", net_buf1);       if (fp1 == NULL)       printf("

File open is failed!

");       else       printf("

File Successfully is opened!

");       while (1) {          // process          if (sendFile(fp1, net_buf1, Net_Buf_Size)) {             sendto(sockfd1, net_buf1, Net_Buf_Size,             SendRecvFlag,             (struct sockaddr*)&addr_con,             addrlen);             break;          }          // send          sendto(sockfd1, net_buf1, Net_Buf_Size,          SendRecvFlag,          (struct sockaddr*)&addr_con, addrlen);          clearBuf(net_buf1);       }       if (fp1 != NULL)       fclose(fp1);    } return 0; }

客户端

// client code for UDP socket programming
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define IP_Protocol 0
#define IP_Address "127.0.0.1" // localhost
#define Port_No 15050
#define Net_Buf_Size 32
#define CipherKey 'S'
#define SendRecvFlag 0
// function for clearing buffer
void clearBuf(char* b1){
   int i;
   for (i = 0; i < Net_Buf_Size; i++)
   b1[i] = '';
}
// function for decryption method
char Cipher(char ch1){
   return ch1 ^ CipherKey;
}
// function for receiveing file
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;
}
// driver code
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;
   // socket()
   sockfd1 = socket(AF_INET, SOCK_DGRAM,
   IP_Protocol);
   if (sockfd1 < 0)
   printf("

file descriptor is not received!!

");    else    printf("

file descriptor %d is received

", sockfd1);    while (1) {       printf("

Please enter the name of file to receive:

");       scanf("%s", net_buf1);       sendto(sockfd1, net_buf1, Net_Buf_Size,       SendRecvFlag, (struct sockaddr*)&addr_con,       addrlen);       printf("

---------Data is Received---------

");       while (1) {          // receive          clearBuf(net_buf1);          nBytes = recvfrom(sockfd1, net_buf1, Net_Buf_Size,          SendRecvFlag, (struct          sockaddr*)&addr_con,          &addrlen);          // process          if (recvFile(net_buf1, Net_Buf_Size)) {             break;          }       }       printf("

-------------------------------

");    }    return 0; }