cannot write file, cannot do variable length packet

Discussion in 'C Programming' started by Marcia Hon, Feb 8, 2004.

  1. Marcia Hon

    Marcia Hon Guest

    Hi,

    Here is my code. In clientFileList3.c, function create_List_of_Files, I
    cannot create a file. It was working at one point but now it does not work.
    Also, I would like to send variable length packets, but do not know how to
    accomplish this.

    clientFileList3.c
    #include <stdio.h>

    #include <stdlib.h>

    #include <sys/socket.h>

    #include <sys/types.h>

    #include <netinet/in.h>

    #include <arpa/inet.h>

    #include <netdb.h>

    #include <fcntl.h>

    #include <unistd.h>

    #include <sys/dir.h>

    #include <sys/param.h>

    #include <sys/stat.h>

    #include <time.h>

    #include <string.h>

    #define BUFFER_MAX 512 //Max buffer size

    #define MESSAGE_BODY 507 //Max Message body

    #define ACK_ATTEMPTS 3 //Acknowledge attempts

    #define ONE_SECOND 10000 //For loop for 1 second

    // Packet Types

    #define RQPG 10 //Request to join Peer Group

    #define PGA 11 //Peer Group Acknowledge

    #define SFL 12 //Shared File List

    #define FLA 13 //File List Acknowledge

    // Message Start Flags

    #define MESST 60 //Start of Message

    #define MESCON 61 //Continued from previous message

    // Message End Flags

    #define MEND 70 //End of Message

    #define MCNTO 71 //Continue to next packet

    #define bool int

    #define false 0

    #define true 1

    char SharedDir[MAXPATHLEN];

    typedef struct packet_header

    {

    unsigned size:16;

    unsigned type:8;

    unsigned message_start_flag:8;

    unsigned message_end_flag:8;

    } PACKET_HEADER;

    int establish_connection(const char * server, unsigned short port);

    int request_to_join_peer_group(const int ServerSocket, unsigned short
    PeerPort);

    int create_List_of_Files(FILE * List_of_Files, char * List, char * subdir,
    FILE * Log, char * log_file);

    int create_files(char * SharedDir);

    int file_select();

    int send_List_of_Files(FILE * List_of_Files, char * List, const int
    ServerSocket);

    unsigned long getFileSize(FILE * List_of_Files, char * List);

    int main(int argc, char *argv[])

    {

    char * Server;

    unsigned short ServerPort, PeerPort;

    int ServerSocket;

    FILE * List_of_Files;

    int test;

    char * List = "List_of_Files";

    char * subdir;

    char * log_file;

    FILE * Log;


    //Check if 3 argments passed

    if (argc != 6)

    {

    fprintf(stderr, "Usage: %s <ser_ip> <ser_port> <cli_port> <subdir>
    <log_file>\n", argv[0]);

    exit(1);

    }


    //Assign arguments to variables

    Server = argv[1];

    ServerPort = atoi(argv[2]);

    PeerPort = atoi(argv[3]);

    subdir = argv[4];

    log_file = argv[5];


    if((ServerSocket = establish_connection(Server, ServerPort)) == -1)

    {

    fprintf(stderr, "Error establishing connection\n");

    exit(1);

    }

    if(create_List_of_Files(List_of_Files, List, subdir, Log, log_file) == -1)

    {

    fprintf(stderr, "Error cannot create List_of_Files\n");

    exit(1);

    }

    if(request_to_join_peer_group(ServerSocket, PeerPort) == -1)

    {

    fprintf(stderr, "Error cannot join Peer Group\n");

    exit(1);

    }

    else

    printf("Joined Peer Group\n");

    if(send_List_of_Files(List_of_Files, List, ServerSocket) == -1)

    {

    fprintf(stderr, "Error cannot upload List_of_Files\n");

    exit(1);

    }

    else

    printf("List_of_Files uploaded. Ready for user.\n");

    return 0;

    }

    int establish_connection (const char * server, unsigned short port)

    {

    struct sockaddr_in server_addr;

    int ServerSocket;

    struct hostent *h;


    ServerSocket = socket(AF_INET, SOCK_STREAM, 0);


    //Set up the structure information

    server_addr.sin_family = AF_INET;

    server_addr.sin_port = htons(port);

    memset(&(server_addr.sin_zero), '\0', 8);


    if((h = gethostbyname(server)) == NULL)

    {

    fprintf(stderr, "Erro getting host %s\n", server);

    return -1;

    }


    server_addr.sin_addr = *((struct in_addr *)h->h_addr);


    printf("IP Address: %s\n", inet_ntoa(*((struct in_addr *)h->h_addr)));

    printf("IP Address: %s\n", inet_ntoa(server_addr.sin_addr));

    printf("Port: %d\n", ntohs(server_addr.sin_port));


    if((connect(ServerSocket, (struct sockaddr *) &server_addr,

    sizeof(struct sockaddr))) == -1)

    {

    fprintf(stderr, "Error: Cannot connect\n");

    return -1;

    }


    return ServerSocket;

    }

    int request_to_join_peer_group(const int ServerSocket, unsigned short
    PeerPort)

    {

    PACKET_HEADER RequestPeerGroup;

    int bytes_sent = 0;

    unsigned * sbuffer;

    int wait;

    int packetsSent = 0;

    int n;


    PACKET_HEADER AckPeerGroup;

    int bytes_received = 0;

    unsigned * rbuffer;

    unsigned * body;

    unsigned block;

    body = &block;


    //Allocate memory for the sending buffer

    if ((sbuffer = (unsigned *) malloc (BUFFER_MAX)) == NULL)

    {

    fprintf(stderr, "Not enough memory for a buffer size of %d \n", BUFFER_MAX);

    return -1;

    }


    RequestPeerGroup.size = sizeof(PeerPort) + 5;

    RequestPeerGroup.type = RQPG;

    RequestPeerGroup.message_start_flag = MESST;

    RequestPeerGroup.message_end_flag = MEND;


    *sbuffer = RequestPeerGroup.size;

    *(sbuffer + 2) = RequestPeerGroup.type;

    *(sbuffer + 3) = RequestPeerGroup.message_start_flag;

    *(sbuffer + 4) = PeerPort;

    *(sbuffer + sizeof(*(sbuffer +4)) +4 - 1) =
    RequestPeerGroup.message_end_flag;


    //Allocate memory for the receiving buffer

    if ((rbuffer = (unsigned *) malloc (BUFFER_MAX)) == NULL)

    {

    fprintf(stderr, "Not enough memory for a buffer size of %d \n", BUFFER_MAX);

    return -1;

    }


    AckPeerGroup.type = 0;


    printf("%x %x %x %x %x\n", *sbuffer, *(sbuffer +2), *(sbuffer +3),
    *(sbuffer+4), *(sbuffer + sizeof(*(sbuffer+4)) + 4 - 1));


    while((packetsSent < ACK_ATTEMPTS) && (AckPeerGroup.type != PGA))

    {

    bytes_sent += send(ServerSocket, sbuffer, *sbuffer, 0);

    printf("Request to Join Peer Group: %d bytes sent\n", bytes_sent);


    if((bytes_received += read(ServerSocket, rbuffer, 2)) > 0)

    {

    AckPeerGroup.size = *rbuffer;


    if((n = read(ServerSocket, (rbuffer+2), (AckPeerGroup.size-2))) > 0)

    {

    bytes_received += n;

    AckPeerGroup.type = *(rbuffer + 2);

    AckPeerGroup.message_start_flag = *(rbuffer + 3);

    *body = *(rbuffer + 4);

    AckPeerGroup.message_end_flag = *(rbuffer + sizeof(*body) + 4 - 1);


    printf("Peer Group Acknowledge: %d bytes received\n", bytes_received);

    }

    }


    for(wait = 0; wait < ONE_SECOND; wait++);

    packetsSent++;

    printf("Packets Sent: %d\n", packetsSent);

    }

    printf("%x %x %x %x %x\n", *rbuffer, *(rbuffer +2), *(rbuffer +3),
    *(rbuffer+4), *(rbuffer + sizeof(*(rbuffer+4)) + 4 - 1));


    free(rbuffer);

    free(sbuffer);


    if(AckPeerGroup.type != PGA)

    return -1;

    else

    return 0;

    }

    int create_List_of_Files(FILE * List_of_Files, char * List, char * subdir,
    FILE * Log, char * log_file)

    {

    struct direct ** files;

    int i;

    int count;

    char * commandformat = "rm -rf '%s'";

    char * command = malloc(strlen(subdir) + strlen(commandformat)+1);

    sprintf(command, commandformat, subdir);

    time_t now;

    time(&now);

    if(system("cd ~/ECE361/project1/shared/") != 0)

    {

    if(system("cd; mkdir ECE361; mkdir ECE361/project1; mkdir
    ECE361/project1/shared") != 0)

    {

    fprintf(stderr, "Error: Cannot make directory ~/ECE361/project1/shared\n",
    subdir);

    return -1;

    }

    else

    printf("~/ECE361/project1/shared/%s created\n", subdir);

    }

    if(chdir((char *)getenv("HOME")) != 0)

    {

    fprintf(stderr, "Error: Cannot change to home directory\n");

    return -1;

    }

    if(chdir("ECE361/project1/shared") != 0)

    {

    fprintf(stderr, "Error: Cannot change to ~/ECE361/project1/shared\n");

    return -1;

    }

    else

    {

    if(system(command) != 0)

    {

    if(mkdir(subdir, S_IRWXU) != 0)

    {

    fprintf(stderr, "Error: make directory ~/ECE361/project1/shared/%s\n",
    subdir);

    return -1;

    }

    if(chdir(subdir) != 0)

    {

    fprintf(stderr, "Error: cannot change to ~/ECE361/project1/shared/%s\n",
    subdir);

    return -1;

    }

    }

    else

    {

    if(mkdir(subdir, S_IRWXU) != 0)

    {

    fprintf(stderr, "Error: make directory ~/ECE361/project1/shared/%s\n",
    subdir);

    return -1;

    }

    if(chdir(subdir) != 0)

    {

    fprintf(stderr, "Error: cannot change to ~/ECE361/project1/shared/%s\n",
    subdir);

    return -1;

    }

    }

    }

    if(getwd(SharedDir) == NULL)

    {

    fprintf(stderr, "Error: Cannot get working directory\n");

    return -1;

    }

    if((Log = fopen(log_file, "a")) == NULL)

    {

    fprintf(stderr, "Error: Cannot open file %s\n", log_file);

    return -1;

    }

    else

    {

    fprintf(Log, "%.24s\n", ctime(&now));

    }

    if(create_files(SharedDir) == -1)

    {

    fprintf(stderr, "Error: Cannot create files\n");

    return -1;

    }

    if((List_of_Files = fopen(List, "w")) == NULL)

    {

    fprintf(stderr, "Error: Cannot create and open %s\n", List);

    return -1;

    }

    count = scandir(SharedDir, &files, file_select, alphasort);

    for(i = 0; i < count; i++)

    {

    fprintf(List_of_Files, "%s\n", files->d_name);

    }

    fclose(List_of_Files);

    return 0;

    }

    int file_select(struct direct *entry)

    {

    struct stat st;

    if((strcmp(entry->d_name, ".") == 0) || (strcmp(entry->d_name, "..") == 0))

    return 0;

    else

    {

    if( 0 > lstat(entry->d_name, &st))

    {

    return 0;

    }

    if(S_ISREG(st.st_mode))

    return 1;

    else

    return 0;

    }

    }

    int create_files(char * SharedDir)

    {

    FILE * passwd;

    if(chdir("/etc") != 0)

    {

    fprintf(stderr, "Error: Cannot open /etc\n");

    return -1;

    }

    if((passwd = fopen("passwd", "r")) == NULL)

    {

    fprintf(stderr, "Error: Cannot read file /etc/passwd\n");

    Canntuc return -1;

    }


    return 0;

    }

    int send_List_of_Files(FILE * List_of_Files, char * List, const int
    ServerSocket)

    {

    PACKET_HEADER SendFileList;

    int bytes_sent = 0;

    unsigned * sbuffer;

    int bodysize = 0;

    bool start;

    bool end;

    int i;

    int j;

    int wait;

    int packetsSent = 0;

    int n;

    PACKET_HEADER AckFileList;

    int bytes_received = 0;

    unsigned * rbuffer;

    unsigned * body;

    unsigned block;

    body = &block;


    //Allocate memory for sending buffer

    if((sbuffer = (unsigned *) malloc (BUFFER_MAX)) == NULL)

    {

    fprintf(stderr, "Not enough memory for a buffer size of %d \n", BUFFER_MAX);

    return -1;

    }

    if((rbuffer = (unsigned *) malloc (BUFFER_MAX)) == NULL)

    {

    fprintf(stderr, "Not enough memory for a buffer size of %d \n", BUFFER_MAX);

    return -1;

    }

    if((bodysize = getFileSize(List_of_Files, List)) == -1)

    {

    fprintf(stderr, "Error: Cannot get List_of_Files size\n");

    return -1;

    }

    AckFileList.type = 0;

    while((packetsSent < ACK_ATTEMPTS) && (AckFileList.type != FLA))

    {

    if((List_of_Files = fopen(List, "r")) == NULL)

    {

    fprintf(stderr, "Cannot open file.\n");

    return -1;

    }

    start = true;

    end = false;

    SendFileList.type = SFL;

    while(!feof(List_of_Files))

    {

    *(sbuffer + 2) = SendFileList.type;

    if(start)

    {

    SendFileList.message_start_flag = MESST;

    start = false;

    }

    else

    SendFileList.message_start_flag = MESCON;

    *(sbuffer + 3) = SendFileList.message_start_flag;

    for(i = 0; i < MESSAGE_BODY; i++)

    {

    *(sbuffer + 4 + i) = fgetc(List_of_Files);

    if(feof(List_of_Files))

    {

    end = true;

    SendFileList.message_end_flag = MEND;

    *(sbuffer + 4 + (i+1) + 4 -1) = SendFileList.message_end_flag;

    break;

    }

    }

    SendFileList.size = i + 5;

    *sbuffer = SendFileList.size;

    if(!end)

    {

    SendFileList.message_end_flag = MCNTO;

    *(sbuffer + 4 + (i+1) + 4 - 1) = SendFileList.message_end_flag;

    }

    printf("%x %x %x\n", *sbuffer, *(sbuffer +2), *(sbuffer + 3));

    for(j = 0; j < i; j++)

    {

    printf("%c", *(sbuffer + 4 + j));

    }

    printf("%x\n", *(sbuffer + 4 + j + 1 + 4 -1));

    bytes_sent += send(ServerSocket, sbuffer, *sbuffer, 0);

    }

    printf("List_of_Files sent: %d bytes sent\n", bytes_sent);

    if((bytes_received += read(ServerSocket, rbuffer, 2)) > 0)

    {

    AckFileList.size = *rbuffer;

    if((n = read(ServerSocket, (rbuffer+2), (AckFileList.size-2))) > 0)

    {

    bytes_received += n;

    AckFileList.type = *(rbuffer + 2);

    AckFileList.message_start_flag = *(rbuffer + 3);

    *body = *(rbuffer + 4);

    AckFileList.message_end_flag = *(rbuffer + sizeof(body) + 4 - 1);


    printf("List_of_Files Acknowledge: %d bytes received\n", bytes_received);

    }

    }


    for(wait = 0; wait < ONE_SECOND; wait++);

    packetsSent++;

    printf("sent number %d\n", packetsSent);

    }

    }




    unsigned long getFileSize(FILE * List_of_Files, char * List)

    {

    unsigned long fileSize;

    if((List_of_Files = fopen(List, "r")) == NULL)

    {

    fprintf(stderr, "Cannot open file.\n");

    return -1;

    }

    else

    {

    if(fseek(List_of_Files, 0, SEEK_END) != 0)

    {

    fprintf(stderr, "Cannot use file.\n");

    return -1;

    }

    fileSize=ftell(List_of_Files);

    }

    if(fclose(List_of_Files)!=0)

    {

    fprintf(stderr, "Cannot close file.\n");

    return -1;

    }

    return fileSize;

    }

    ****************************************************************************
    ********************************************************************

    serverFileList3.c:

    #include <stdio.h>

    #include <sys/types.h>

    #include <sys/socket.h>

    #include <netinet/in.h>

    #define BUFFER_MAX 512

    #define PGA 11

    #define FLA 13

    #define MESST 60

    #define MESCON 61

    #define MEND 70

    #define MCNTO 71

    typedef struct packet_header

    {

    unsigned size:16;

    unsigned type:8;

    unsigned message_start_flag:8;

    unsigned message_end_flag:8;

    } PACKET_HEADER;

    int main (int argc, char **argv)

    {

    int port;

    FILE *fp;

    int sd, new_sd, client_len;

    struct sockaddr_in server, client;

    unsigned * rbuffer, * sbuffer, * body, block;

    int n;

    PACKET_HEADER sendPacket;

    PACKET_HEADER receivePacket;

    int bytes_sent;

    int bytes_received = 0;

    body = &block;


    if(argc == 3)

    port = atoi(argv[1]);

    else

    {

    fprintf(stderr, "Usage: %s <port> <file>", argv[0]);

    exit(1);

    }


    if((fp = fopen(argv[2], "w")) == NULL)

    {

    fprintf(stderr, "Error: Could not open %s\n", argv[3]);

    exit(1);

    }


    if((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

    {

    fprintf(stderr, "Can't create a socket\n");

    exit(1);

    }


    bzero((char *) &server, sizeof(struct sockaddr_in));

    server.sin_family = AF_INET;

    server.sin_port = htons(port);

    server.sin_addr.s_addr = htonl(INADDR_ANY);

    if(bind(sd, (struct sockaddr *)&server, sizeof(server)) == -1)

    {

    fprintf(stderr, "Can't bind name to socket\n");

    exit(1);

    }


    listen(sd,1);


    client_len = sizeof(client);

    if((new_sd = accept(sd, (struct sockaddr *) &client, &client_len)) == -1)

    {

    fprintf(stderr, "Can't accept client\n");

    close(fp);

    close(sd);

    exit(1);

    }


    printf("Connection with client established\n");


    //Allocate memory for the receiving buffer

    if ((rbuffer = (unsigned *) malloc (BUFFER_MAX)) == NULL)

    {

    fprintf(stderr, "Not enough memory for a buffer size of %d \n", BUFFER_MAX);

    exit(1);

    }


    if((bytes_received += read(new_sd, rbuffer, 2)) > 0)

    {

    receivePacket.size = *rbuffer;

    if((n = read(new_sd, (rbuffer+2), (*rbuffer-2))) > 0)

    {

    bytes_received += n;

    receivePacket.type = *(rbuffer + 2);

    receivePacket.message_start_flag = *(rbuffer + 3);

    *body = *(rbuffer + 4);

    receivePacket.message_end_flag = *(rbuffer + sizeof(body) + 4 - 1);


    printf("Port received: %d \n", *body);

    }

    }


    printf("%x %x %x %x %x\n", *rbuffer, *(rbuffer +2), *(rbuffer +3),
    *(rbuffer+4), *(rbuffer + sizeof(*(rbuffer+4)) + 4 -1));


    if((sbuffer = (unsigned *) malloc (BUFFER_MAX)) == NULL)

    {

    fprintf(stderr, "Not enough memory for a buffer size of %d \n", BUFFER_MAX);

    exit(1);

    }

    sendPacket.size = 5;

    sendPacket.type = PGA;

    sendPacket.message_start_flag = MESST;

    sendPacket.message_end_flag = MEND;

    *sbuffer = sendPacket.size;

    *(sbuffer + 2) = sendPacket.type;

    *(sbuffer + 3) = sendPacket.message_start_flag;

    *(sbuffer + 4) = 0;

    *(sbuffer + sizeof(*(sbuffer +4)) +4 - 1) = sendPacket.message_end_flag;

    bytes_sent += send(new_sd, sbuffer, *sbuffer, 0);

    bytes_sent += send(new_sd, (sbuffer+2), (sendPacket.size-2),0);

    printf("%x %x %x %x %x\n", *sbuffer, *(sbuffer +2), *(sbuffer +3),
    *(sbuffer+4), *(sbuffer + sizeof(*(rbuffer+4)) + 4 -1));

    sendPacket.type = FLA;

    *(sbuffer + 2) = sendPacket.type;

    n = read(new_sd, rbuffer, BUFFER_MAX);

    bytes_sent = send(new_sd, sbuffer, BUFFER_MAX, 0);

    close(new_sd);

    fclose(fp);

    close(sd);


    return 0;

    }
    Marcia Hon, Feb 8, 2004
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Marcia Hon

    Variable Length Packet

    Marcia Hon, Feb 8, 2004, in forum: C Programming
    Replies:
    1
    Views:
    1,022
    James Hu
    Feb 8, 2004
  2. Mike Wahler
    Replies:
    0
    Views:
    398
    Mike Wahler
    Feb 8, 2004
  3. Martin Ambuhl
    Replies:
    0
    Views:
    375
    Martin Ambuhl
    Feb 8, 2004
  4. Li Han
    Replies:
    2
    Views:
    499
    bobicanprogram
    Feb 9, 2009
  5. Gelonida N
    Replies:
    4
    Views:
    866
    Gelonida N
    Sep 11, 2011
Loading...

Share This Page