0% found this document useful (0 votes)
8 views

COMPUTER NETWORKS EXPERIMENT-4

The document contains a server and client code for a simple socket-based application in C. The server processes messages to find the first and last letters, extract digits, or combine two messages based on user-selected services. The client connects to the server, sends requests, and displays the server's responses.

Uploaded by

reshmabanu.td
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views

COMPUTER NETWORKS EXPERIMENT-4

The document contains a server and client code for a simple socket-based application in C. The server processes messages to find the first and last letters, extract digits, or combine two messages based on user-selected services. The client connects to the server, sends requests, and displays the server's responses.

Uploaded by

reshmabanu.td
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 13

COMPUTER NETWORKS

EXPERIMENT – 4

Server code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 12345


#define MAX_BUFFER 1024

void find_first_last_letter(char *message, char


*response) {
char first = '\0', last = '\0';
for (int i = 0; message[i] != '\0'; i++) {
if (isalpha(message[i])) {
if (first == '\0') first = message[i];
last = message[i];
}
}
if (first != '\0' && last != '\0') {
sprintf(response, "First letter: %c, Last letter: %c",
first, last);
} else {
strcpy(response, "No letters found.");
}
}

void find_digits(char *message, char *response) {


char digits[MAX_BUFFER] = {0};
int idx = 0;
for (int i = 0; message[i] != '\0'; i++) {
if (isdigit(message[i])) {
digits[idx++] = message[i];
}
}
if (idx > 0) {
sprintf(response, "Digits found: %s", digits);
} else {
strcpy(response, "No digits found.");
}
}

void combine_messages(char *message1, char


*message2, char *response) {
sprintf(response, "Combined message: %s %s",
message1, message2);
}

int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[MAX_BUFFER], response[MAX_BUFFER];

if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -


1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&server_addr,
sizeof(server_addr)) == -1) {
perror("Bind failed");
close(server_fd);
exit(EXIT_FAILURE);
}

if (listen(server_fd, 3) == -1) {
perror("Listen failed");
close(server_fd);
exit(EXIT_FAILURE);
}

printf("Server started. Waiting for clients...\n");


if ((client_fd = accept(server_fd, (struct sockaddr
*)&client_addr, &client_len)) == -1) {
perror("Accept failed");
close(server_fd);
exit(EXIT_FAILURE);
}

printf("Client connected.\n");

while (1) {
memset(buffer, 0, sizeof(buffer));
int read_size = read(client_fd, buffer, sizeof(buffer));
if (read_size == 0) {
printf("Client disconnected.\n");
break;
}
char service = buffer[0];
char *message = buffer + 2;

switch (service) {
case '1':
find_first_last_letter(message, response);
break;
case '2':
find_digits(message, response);
break;
case '3':
{
char *semicolon_pos = strchr(message, ';');
if (semicolon_pos != NULL) {
*semicolon_pos = '\0';
char *message2 = semicolon_pos + 1;
combine_messages(message, message2,
response);
} else {
strcpy(response, "Invalid input for service 3.
Please enter two messages separated by a semicolon.");
}
}
break;
default:
strcpy(response, "Invalid service requested.");
break;
}

write(client_fd, response, strlen(response));


}

close(client_fd);
close(server_fd);
return 0;
}

Client Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 12345


#define MAX_BUFFER 1024

int main() {
int sock;
struct sockaddr_in server_addr;
char buffer[MAX_BUFFER];
char service;
char message[MAX_BUFFER];

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {


perror("Socket creation failed");
exit(EXIT_FAILURE);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

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


sizeof(server_addr)) == -1) {
perror("Connection failed");
close(sock);
exit(EXIT_FAILURE);
}

printf("Connected to server.\n");

while (1) {
printf("\nSelect a service:\n");
printf("1: Find the first and last letter in the
message\n");
printf("2: Find the digits in the message\n");
printf("3: Combine two messages\n");
printf("Enter service number (or 'exit' to quit): ");
fgets(buffer, sizeof(buffer), stdin);

if (strncmp(buffer, "exit", 4) == 0) {
break;
}
service = buffer[0];
printf("Enter your message: ");
fgets(message, sizeof(message), stdin);

message[strcspn(message, "\n")] = 0;

snprintf(buffer, sizeof(buffer), "%c: %.1020s",


service, message);
write(sock, buffer, strlen(buffer));

memset(buffer, 0, sizeof(buffer));
int read_size = read(sock, buffer, sizeof(buffer));
if (read_size > 0) {
printf("Server response: %s\n", buffer);
}
}
close(sock);
return 0;
}

Output:

You might also like