Socket Programming
unknown
c_cpp
a year ago
6.7 kB
4
Indexable
//client.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 // Function to calculate CRC int calculateCRC(const char *data) { int crc = 0; for (int i = 0; i < strlen(data); ++i) { crc ^= (int)data[i] << 8; for (int j = 0; j < 8; ++j) { if (crc & 0x8000) { crc = (crc << 1) ^ 0x1021; // Polynomial: x^16 + x^12 + x^5 + 1 } else { crc = crc << 1; } } } return crc & 0xFFFF; } // Function to calculate LRC int calculateLRC(const char *data) { int lrc = 0; for (int i = 0; i < strlen(data); i++) { lrc ^= data[i]; } return lrc; } // Function to calculate VRC (using even parity) int calculateVRC(const char *data) { int count = 0; for (int i = 0; i < strlen(data); i++) { if (data[i] == '1') { count++; } } return (count % 2 == 0) ? 0 : 1; } // Function to calculate simple checksum int calculateChecksum(const char *data) { int checksum = 0; for (int i = 0; i < strlen(data); i++) { checksum += data[i]; } return checksum; } int main() { struct sockaddr_in serv_addr; int sock = 0; char buffer[BUFFER_SIZE] = {0}; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // Convert IPv4 and IPv6 addresses from text to binary form if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("\nInvalid address/ Address not supported \n"); return -1; } if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } char data[BUFFER_SIZE]; printf("Enter data to send: "); fgets(data, BUFFER_SIZE, stdin); // Ask user for error detection method printf("Choose an error detection method:\n"); printf("1. CRC\n"); printf("2. LRC\n"); printf("3. VRC\n"); printf("4. Simple Checksum\n"); printf("Enter your choice: "); int choice; scanf("%d", &choice); while(getchar() != '\n'); // Clear input buffer int errorBits = 0; switch (choice) { case 1: // CRC errorBits = calculateCRC(data); break; case 2: // LRC errorBits = calculateLRC(data); break; case 3: // VRC errorBits = calculateVRC(data); break; case 4: // Simple Checksum errorBits = calculateChecksum(data); break; default: printf("Invalid choice\n"); return -1; } // Send data with error detection bits to server send(sock, data, strlen(data), 0); send(sock, &errorBits, sizeof(int), 0); printf("Data sent successfully\n"); close(sock); return 0; } //server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 // Function to calculate CRC int calculateCRC(const char *data) { int crc = 0; for (int i = 0; i < strlen(data); ++i) { crc ^= (int)data[i] << 8; for (int j = 0; j < 8; ++j) { if (crc & 0x8000) { crc = (crc << 1) ^ 0x1021; // Polynomial: x^16 + x^12 + x^5 + 1 } else { crc = crc << 1; } } } return crc & 0xFFFF; } // Function to calculate LRC int calculateLRC(const char *data) { int lrc = 0; for (int i = 0; i < strlen(data); i++) { lrc ^= data[i]; } return lrc; } // Function to calculate VRC (using even parity) int calculateVRC(const char *data) { int count = 0; for (int i = 0; i < strlen(data); i++) { if (data[i] == '1') { count++; } } return (count % 2 == 0) ? 0 : 1; } // Function to calculate simple checksum int calculateChecksum(const char *data) { int checksum = 0; for (int i = 0; i < strlen(data); i++) { checksum += data[i]; } return checksum; } int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[BUFFER_SIZE] = {0}; int errorBits = 0; // Creating socket file descriptor if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // Forcefully attaching socket to the port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // Forcefully attaching socket to the port 8080 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // Read data and error bits from client valread = read(new_socket, buffer, BUFFER_SIZE); if (valread <= 0) { printf("Error reading data from client\n"); exit(EXIT_FAILURE); } read(new_socket, &errorBits, sizeof(int)); // Verify data based on error detection method int errorDetected = 0; switch (errorBits) { case 1: // CRC if (calculateCRC(buffer) != 0) { errorDetected = 1; } break; case 2: // LRC if (calculateLRC(buffer) != 0) { errorDetected = 1; } break; case 3: // VRC if (calculateVRC(buffer) != 0) { errorDetected = 1; } break; case 4: // Simple Checksum if (calculateChecksum(buffer) != 0) { errorDetected = 1; } break; default: printf("Invalid error detection method\n"); break; } // Output result if (errorDetected) { printf("Error detected in received data!\n"); } else { printf("Data received without error: %s\n", buffer); } close(new_socket); close(server_fd); return 0; }
Editor is loading...
Leave a Comment