File Transfer using TCP Socket in C

In this tutorial, you will learn how to perform a file (data) transfer over a TCP socket in the C programming language. You will see how a client reads the data from a text file sends it to the server and then saves the data back into a text file.

For this tutorial, I am going to use the TCP to establish the connection between the client and the server.

RELATED TUTORIALS:

What is TCP

TCP refers to the Transmission Control Protocol, which is a highly efficient and reliable protocol designed for end-to-end data transmission over an unreliable network. 

A TCP connection uses a three-way handshake to connect the client and the server. It is a process that requires both the client and the server to exchange synchronization (SYN) and acknowledge (ACK) packets before the data transfer takes place.

Some important features of TCP:

  • It’s a connection-oriented protocol.
  • It provides error-checking and recovery mechanisms.
  • It helps in end-to-end communication.

Project Structure

The project is divided into two files:

  1. client.c
  2. server.c

The client.c file contains the code for the client-side, which read the text file and sends it to the server and the server.c file receives the data from the client and saves it in a text file.

Client

The client performs the following functions.

  1. Start the program
  2. Declare the variables and structures required.
  3. A socket is created and the connect function is executed.
  4. The file is opened.
  5. The data from the file is read and sent to the server.
  6. The socket is closed.
  7. The program is stopped.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#define SIZE 1024

void send_file(FILE *fp, int sockfd){
  int n;
  char data[SIZE] = {0};

  while(fgets(data, SIZE, fp) != NULL) {
    if (send(sockfd, data, sizeof(data), 0) == -1) {
      perror("[-]Error in sending file.");
      exit(1);
    }
    bzero(data, SIZE);
  }
}

int main(){
  char *ip = "127.0.0.1";
  int port = 8080;
  int e;

  int sockfd;
  struct sockaddr_in server_addr;
  FILE *fp;
  char *filename = "send.txt";

  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if(sockfd < 0) {
    perror("[-]Error in socket");
    exit(1);
  }
  printf("[+]Server socket created successfully.\n");

  server_addr.sin_family = AF_INET;
  server_addr.sin_port = port;
  server_addr.sin_addr.s_addr = inet_addr(ip);

  e = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  if(e == -1) {
    perror("[-]Error in socket");
    exit(1);
  }
 printf("[+]Connected to Server.\n");

  fp = fopen(filename, "r");
  if (fp == NULL) {
    perror("[-]Error in reading file.");
    exit(1);
  }

  send_file(fp, sockfd);
  printf("[+]File data sent successfully.\n");

  printf("[+]Closing the connection.\n");
  close(sockfd);

  return 0;
}

Server

The server performs the following functions.

  1. Start the program.
  2. Declare the variables and structures required.
  3. The socket is created using the socket function.
  4. The socket is binded to the specific port.
  5. Start listening for the connections.
  6. Accept the connection from the client.
  7. Create a new file.
  8. Receives the data from the client.
  9. Write the data into the file.
  10. The program is stopped.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#define SIZE 1024

void write_file(int sockfd){
  int n;
  FILE *fp;
  char *filename = "recv.txt";
  char buffer[SIZE];

  fp = fopen(filename, "w");
  while (1) {
    n = recv(sockfd, buffer, SIZE, 0);
    if (n <= 0){
      break;
      return;
    }
    fprintf(fp, "%s", buffer);
    bzero(buffer, SIZE);
  }
  return;
}

int main(){
  char *ip = "127.0.0.1";
  int port = 8080;
  int e;

  int sockfd, new_sock;
  struct sockaddr_in server_addr, new_addr;
  socklen_t addr_size;
  char buffer[SIZE];

  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if(sockfd < 0) {
    perror("[-]Error in socket");
    exit(1);
  }
  printf("[+]Server socket created successfully.\n");

  server_addr.sin_family = AF_INET;
  server_addr.sin_port = port;
  server_addr.sin_addr.s_addr = inet_addr(ip);

  e = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  if(e < 0) {
    perror("[-]Error in bind");
    exit(1);
  }
  printf("[+]Binding successfull.\n");

  if(listen(sockfd, 10) == 0){
 printf("[+]Listening....\n");
 }else{
 perror("[-]Error in listening");
    exit(1);
 }

  addr_size = sizeof(new_addr);
  new_sock = accept(sockfd, (struct sockaddr*)&new_addr, &addr_size);
  write_file(new_sock);
  printf("[+]Data written in the file successfully.\n");

  return 0;
}
you will learn how to perform a file (data) transfer over a TCP socket in C programming language. You will see how a client reads the data from a text file sends it to the server and then saves the data back into a text file.
Client and server program execution in terminal window.

Summary

In this tutorial, you learn to implement a simple TCP file transfer using a client-server program in the C programming language. If you still have some questions or queries?

Contact:

Nikhil Tomar

I am an independent researcher in the field of Artificial Intelligence. I love to write about the technology I am working on.

You may also like...

4 Responses

  1. Avindu says:

    Hi Nikhil,

    Can I follow the same method when I am coding a multiple client – server system?

  2. Shreya says:

    Client on requesting a file, the server should send it by asking for the file name in the terminal. How to do it?
    Can u please help?

  3. Abhirami says:

    Please let know how can I send an image?

Leave a Reply

Your email address will not be published. Required fields are marked *