Computer >> Máy Tính >  >> Lập trình >> lập trình C

Chương trình C cho tệp Truyền bằng UDP?

Dữ liệu có thể được chuyển giữa hai máy tính thực hiện lập trình Socket trong C.

Trong trường hợp tương tự, các tệp có thể dễ dàng được gửi đi bằng Giao thức sơ đồ người dùng (UDP) và máy khách / máy chủ đơn giản.

Bảo mật - Xử lý bằng mã hóa.

Giao thức - UDP

Mã hóa - Mã hóa XOR

Thuật toán

  • Máy chủ được khởi động và đợi tên tệp.

  • Tên tệp được gửi bởi máy khách.

  • Tên tệp này được máy chủ nhận. Nếu có tệp, máy chủ sẽ bắt đầu đọc tệp và tiếp tục gửi một bộ đệm chứa đầy nội dung tệp được mã hóa cho đến khi và trừ khi đạt đến cuối tệp.

  • Cuối tệp được đánh dấu bởi EOF.

  • Tệp được nhận dưới dạng bộ đệm cho đến khi và trừ khi nhận được EOF. Sau đó, nó được mã hóa sinh thái.

  • Nếu tệp không có, một thông báo "không tìm thấy tệp" sẽ được gửi.

Máy chủ

// 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] = '\0';
}
// 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("\nfile descriptor is not received!!\n");
   else
      printf("\nfile descriptor %d is received\n", sockfd1);
   // bind()
   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");
      // 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("\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) {
         // 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;
}

Khách hàng

// 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] = '\0';
}
// 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("\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) {
         // 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("\n-------------------------------\n");
   }
   return 0;
}