Untitled
#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