0% found this document useful (0 votes)
16 views9 pages

CN Lab 5

The document contains code for a chat application with both client and server implementations in C. The client connects to the server, sends messages, and receives echoed responses until the 'logout' command is issued. The server handles multiple clients using threads, allowing for concurrent message processing and echoing back to clients.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views9 pages

CN Lab 5

The document contains code for a chat application with both client and server implementations in C. The client connects to the server, sends messages, and receives echoed responses until the 'logout' command is issued. The server handles multiple clients using threads, allowing for concurrent message processing and echoing back to clients.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 9

CN LAB 5

QUESTION 1

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <netinet/in.h>

#define PORT 8080

#define BUFFER_SIZE 1024

int main() { int sock = 0; struct sockaddr_in serv_addr; char buffer[BUFFER_SIZE];

sock = socket(AF_INET, SOCK_STREAM, 0);


serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = INADDR_ANY;

connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));


printf("Connected to server. Type messages (type 'logout' to
exit):\n");

while (1) {
fgets(buffer, BUFFER_SIZE, stdin);
buffer[strcspn(buffer, "\n")] = 0; // Remove newline

send(sock, buffer, strlen(buffer), 0);

if (strncmp(buffer, "logout", 6) == 0) break;

memset(buffer, 0, BUFFER_SIZE);
read(sock, buffer, BUFFER_SIZE);
printf("Server echoed: %s\n", buffer);
}

close(sock);
return 0;

QUESTION 2

SERVER CODE

// chat_server.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define PORT 8080 #define MAX_CLIENTS 10 #define BUFFER_SIZE 1024


int main() { int server_fd, client_fd, client_sockets[MAX_CLIENTS], max_sd, sd, activity;
struct sockaddr_in address; socklen_t addrlen = sizeof(address); char
buffer[BUFFER_SIZE]; fd_set readfds;

for (int i = 0; i < MAX_CLIENTS; i++) client_sockets[i] = 0;

server_fd = socket(AF_INET, SOCK_STREAM, 0);


setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &(int){1},
sizeof(int));

address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
listen(server_fd, 5);

printf("Server listening on port %d...\n", PORT);

while (1) {
FD_ZERO(&readfds);
FD_SET(server_fd, &readfds);
max_sd = server_fd;

for (int i = 0; i < MAX_CLIENTS; i++) {


sd = client_sockets[i];
if (sd > 0) FD_SET(sd, &readfds);
if (sd > max_sd) max_sd = sd;
}

activity = select(max_sd + 1, &readfds, NULL, NULL, NULL);

if (FD_ISSET(server_fd, &readfds)) {
client_fd = accept(server_fd, (struct sockaddr*)&address,
&addrlen);
printf("New connection: %s:%d\n", inet_ntoa(address.sin_addr),
ntohs(address.sin_port));
for (int i = 0; i < MAX_CLIENTS; i++) {
if (client_sockets[i] == 0) {
client_sockets[i] = client_fd;
break;
}
}
}

for (int i = 0; i < MAX_CLIENTS; i++) {


sd = client_sockets[i];
if (FD_ISSET(sd, &readfds)) {
int valread = read(sd, buffer, BUFFER_SIZE);
if (valread <= 0) {
close(sd);
client_sockets[i] = 0;
printf("Client disconnected\n");
} else {
buffer[valread] = '\0';
if (strcmp(buffer, "logout\n") == 0) {
close(sd);
client_sockets[i] = 0;
printf("Client logged out\n");
} else {
printf("Client [%d]: %s", sd, buffer);
send(sd, buffer, strlen(buffer), 0); // Echo
}
}
}
}
}

return 0;

CLIENT CODE

// chat_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


int main() { int sock; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE];

sock = socket(AF_INET, SOCK_STREAM, 0);


server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));


printf("Connected to server. Type 'logout' to disconnect.\n");

while (1) {
printf("You: ");
fgets(buffer, BUFFER_SIZE, stdin);
send(sock, buffer, strlen(buffer), 0);

if (strcmp(buffer, "logout\n") == 0) {
printf("Logging out...\n");
break;
}

int valread = read(sock, buffer, BUFFER_SIZE);


buffer[valread] = '\0';
printf("Server: %s", buffer);
}

close(sock);
return 0;

}
QUESTION 3

SERVER CODE

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include


<arpa/inet.h>

#define PORT 8080 #define BUFFER_SIZE 1024

int main() { int sock; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE];

sock = socket(AF_INET, SOCK_STREAM, 0);


server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));


printf("Connected to server. Type 'logout' to disconnect.\n");

while (1) {
printf("You: ");
fgets(buffer, BUFFER_SIZE, stdin);
send(sock, buffer, strlen(buffer), 0);
if (strcmp(buffer, "logout\n") == 0) {
printf("Logging out...\n");
break;
}

int valread = read(sock, buffer, BUFFER_SIZE);


buffer[valread] = '\0';
printf("Server: %s", buffer);
}

close(sock);
return 0;

CLIENT CODE

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include


<pthread.h> #include <netinet/in.h> #include <arpa/inet.h>

#define PORT 8080 #define BUFFER_SIZE 1024

void* handle_client(void* arg) { int client_socket = (int)arg; free(arg); char


buffer[BUFFER_SIZE]; int bytes_read;

while ((bytes_read = read(client_socket, buffer, BUFFER_SIZE)) > 0) {


buffer[bytes_read] = '\0';
printf("Client [%d]: %s", client_socket, buffer);

if (strcmp(buffer, "logout\n") == 0) {
printf("Client [%d] requested logout.\n", client_socket);
break;
}

send(client_socket, buffer, strlen(buffer), 0); // Echo back


}

close(client_socket);
printf("Connection with client [%d] closed.\n", client_socket);
return NULL;

int main() { int server_fd, *client_socket; struct sockaddr_in server_addr, client_addr;


socklen_t client_len = sizeof(client_addr); pthread_t tid;

server_fd = socket(AF_INET, SOCK_STREAM, 0);


setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &(int){1},
sizeof(int));

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);

bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));


listen(server_fd, 10);

printf("Server listening on port %d...\n", PORT);

while (1) {
client_socket = malloc(sizeof(int));
*client_socket = accept(server_fd, (struct sockaddr*)&client_addr,
&client_len);

printf("New connection: %s:%d\n",


inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));

pthread_create(&tid, NULL, handle_client, client_socket);


pthread_detach(tid); // Automatically reclaim thread resources
}

close(server_fd);
return 0;

You might also like