Untitled

 avatar
unknown
plain_text
2 months ago
3.9 kB
3
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <arpa/inet.h>

void error(const char *msg) {
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
    int fd, sockfd, newsockfd, clilen, portno, n;
    struct sockaddr_in serv_addr, cli_addr;
    char buffer[4096];

    if (argc < 2)
    {
        fprintf(stderr, "ERROR, no port provided\n");
        exit(1);
    }

    // Create socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");

    // Clear and initialize server address structure
    memset((char *) &serv_addr, 0, sizeof(serv_addr));
    portno = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);

    // Bind socket
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        error("ERROR on binding");

    // Listen for connections
    listen(sockfd, 5);
    clilen = sizeof(cli_addr);

    printf("SERVER waiting for the CLIENT.... \n");

    while (1)
    {
        // Accept client connection
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
        if (newsockfd < 0)
            error("ERROR on accept");

        // Clear buffer and read filename from client
        memset(buffer, 0, sizeof(buffer));
        n = read(newsockfd, buffer, sizeof(buffer) - 1);
        if (n < 0)
            error("ERROR reading from socket");

        // Open the requested file
        fd = open(buffer, O_RDONLY);
        if (fd < 0)
        {
            perror("File open error");
            close(newsockfd);
            continue;
        }

        // Read and send file contents
        while ((n = read(fd, buffer, sizeof(buffer))) > 0)
        {
            if (write(newsockfd, buffer, n) < 0)
            {
                perror("ERROR writing to socket");
                break;
            }
        }

        // Close file and client socket
        close(fd);
        close(newsockfd);

        printf("Transfer Completed\n");
    }

    // Close server socket (this line is technically unreachable due to infinite loop)
    close(sockfd);
    return 0;
}


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/fcntl.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    char buffer[4096];
    char *servip;

    if (argc < 4)
    {
        fprintf(stderr, "usage is: %s serverip filename port\n", argv[0]);
        exit(1);
    }

    servip = argv[1];
    portno = atoi(argv[3]);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("Error opening socket");
        exit(1);
    }
    printf("Client online\n");

    memset((char *) &serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(servip);
    serv_addr.sin_port = htons(portno);

    if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
    {
        perror("Error connecting");
        exit(1);
    }

    // Fixed: correct strlen and write of filename
    write(sockfd, argv[2], strlen(argv[2]));

    memset(buffer, 0, sizeof(buffer));
    n = read(sockfd, buffer, sizeof(buffer) - 1);
    if (n <= 0)
    {
        perror("File not found");
        close(sockfd);
        exit(1);
    }

    // Write received buffer to standard output
    write(1, buffer, n);

    close(sockfd);
    return 0;
}
Leave a Comment