2

I want to send a file using UDP with stop and wait protocol. I have a client and server code that is working fine with a single input string.

I was trying to change the code for file transfer but no success. Can anyone help me with minimal changes to convert the below code for using file transfer?

code of client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

typedef struct packet{
   char data[1024];
}Packet;

typedef struct frame{
    int frame_kind; //ACK:0, SEQ:1 FIN:2
    int sq_no;
    int ack;
    Packet packet;
}Frame;

int main(int argc, char **argv[]){
    if (argc != 2){
        printf("Usage: %s <port>", argv[0]);
        exit(0);    
    }

int port = atoi(argv[1]);
int sockfd;
struct sockaddr_in serverAddr;
char buffer[1024];
socklen_t addr_size;

int frame_id = 0;
Frame frame_send;
Frame frame_recv;
int ack_recv = 1;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

memset(&serverAddr, '\0', sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

while(1){
    
    if(ack_recv == 1){
        frame_send.sq_no = frame_id;
        frame_send.frame_kind = 1;
        frame_send.ack = 0;     

        printf("Enter Data: ");
        scanf("%s", buffer);
        strcpy(frame_send.packet.data, buffer);
        sendto(sockfd, &frame_send, sizeof(Frame), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
        printf("[+]Frame Send\n");
    }
    int addr_size = sizeof(serverAddr);
    int f_recv_size = recvfrom(sockfd, &frame_recv, sizeof(frame_recv), 0 ,(struct sockaddr*)&serverAddr, &addr_size);
    
    if( f_recv_size > 0 && frame_recv.sq_no == 0 && frame_recv.ack == frame_id+1){
        printf("[+]Ack Received\n");
        ack_recv = 1;
    }else{
        printf("[-]Ack Not Received\n");
        ack_recv = 0;
    }   
        
    frame_id++;     
}

close(sockfd);
return 0;
}

Code of server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>


typedef struct packet{
    char data[1024];
}Packet;

typedef struct frame{
   int frame_kind; //ACK:0, SEQ:1 FIN:2
   int sq_no;
   int ack;
   Packet packet;
}Frame;

int main(int argc, char** argv){

    if (argc != 2){
        printf("Usage: %s <port>", argv[0]);
        exit(0);    
    }

int port = atoi(argv[1]);
int sockfd;
struct sockaddr_in serverAddr, newAddr;
char buffer[1024];
socklen_t addr_size;

int frame_id=0;
Frame frame_recv;
Frame frame_send;   

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

memset(&serverAddr, '\0', sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
addr_size = sizeof(newAddr);

while(1){
    int f_recv_size = recvfrom(sockfd, &frame_recv, sizeof(Frame), 0, (struct sockaddr*)&newAddr, &addr_size);
    if (f_recv_size > 0 && frame_recv.frame_kind == 1 && frame_recv.sq_no == frame_id){
        printf("[+]Frame Received: %s\n", frame_recv.packet.data);
        
        frame_send.sq_no = 0;
        frame_send.frame_kind = 0;
        frame_send.ack = frame_recv.sq_no + 1;
        sendto(sockfd, &frame_send, sizeof(frame_send), 0, (struct sockaddr*)&newAddr, addr_size);
        printf("[+]Ack Send\n");
    }else{
        printf("[+]Frame Not Received\n");
    }
    frame_id++; 
}

close(sockfd);
return 0;
}

Please help me. I am a beginner and taking references but not able to achieve.

  • How can you send a file if you never open a file? – stark Jun 18 '21 at 15:41
  • @stark Actually on my local i am trying to read a file and convert into frames but no luck till now. so I thought, I should put working code to ask if anyone can help me with that. – I am learning Jun 18 '21 at 15:49
  • 1
    Here's a typical post on reading and writing files https://stackoverflow.com/q/47372838/1216776 – stark Jun 18 '21 at 16:18
  • @stark thanks for sharing the reference but reading a file and writing a file is not much of an issue. The issue is not able to transfer that file using frames and stop and wait protocol. Can you help me with that? – I am learning Jun 18 '21 at 16:26
  • i know your code came from this: https://github.com/nikhilroxtomar/Stop-and-Wait-Protocol-Implemented-in-UDP-C i think you should create your own modification first, like opening the file and reading the file, and then ask what problem you had – nashihu Nov 09 '22 at 02:01

0 Answers0