Home > Backend Development > C++ > body text

C program for file transfer using UDP

PHPz
Release: 2023-09-13 16:45:02
forward
1507 people have browsed it

C program for file transfer using UDP

数据可以在两台使用 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 &#39;S&#39;
#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] = &#39;\0&#39;;
}
// 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("</p><p>file descriptor is not received!!</p><p>");
   else
      printf("</p><p>file descriptor %d is received</p><p>", sockfd1);
   // bind()
   if (bind(sockfd1, (struct sockaddr*)&addr_con,
      sizeof(addr_con)) == 0)
      printf("</p><p>Successfully is binded!</p><p>");
   else
      printf("</p><p>Binding is Failed!</p><p>");
   while (1) {
      printf("</p><p>Waiting for name of file...</p><p>");
      // 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("</p><p>File Name is Received: %s</p><p>", net_buf1);
      if (fp1 == NULL)
      printf("</p><p>File open is failed!</p><p>");
      else
      printf("</p><p>File Successfully is opened!</p><p>");
      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;
}

Copy after login

客户端

// 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 &#39;S&#39;
#define SendRecvFlag 0
// function for clearing buffer
void clearBuf(char* b1){
   int i;
   for (i = 0; i < Net_Buf_Size; i++)
   b1[i] = &#39;\0&#39;;
}
// 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("</p><p>file descriptor is not received!!</p><p>");
   else
   printf("</p><p>file descriptor %d is received</p><p>", sockfd1);
   while (1) {
      printf("</p><p>Please enter the name of file to receive:</p><p>");
      scanf("%s", net_buf1);
      sendto(sockfd1, net_buf1, Net_Buf_Size,
      SendRecvFlag, (struct sockaddr*)&addr_con,
      addrlen);
      printf("</p><p>---------Data is Received---------</p><p>");
      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("</p><p>-------------------------------</p><p>");
   }
   return 0;
}
Copy after login

The above is the detailed content of C program for file transfer using UDP. For more information, please follow other related articles on the PHP Chinese website!

source:tutorialspoint.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template