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;