CCN2
CCN2
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <fcntl.h>
int main() {
int server_fd, client_fd, epoll_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
struct epoll_event event, events[MAX_EVENTS];
while (1) {
int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
for (int i = 0; i < nfds; i++) {
if (events[i].data.fd == server_fd) {
// Accept new connection
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
if (client_fd == -1) {
perror("accept");
continue;
}
printf("Accepted connection from client\n");
set_nonblocking(client_fd);
// Clean up
close(server_fd);
close(epoll_fd);
return 0;
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int sock_fd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// Create socket
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// Connect to server
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
while (1) {
// Read input from user
printf("> ");
fgets(buffer, BUFFER_SIZE, stdin);
// Clean up
close(sock_fd);
return 0;
}
Multicasting
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int sock_fd;
struct sockaddr_in multicast_addr;
// Create a UDP socket
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// Clean up
close(sock_fd);
return 0;
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main() {
int sock_fd;
struct sockaddr_in local_addr, multicast_addr;
char buffer[BUFFER_SIZE];
int n;
// Create a UDP socket
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// Bind the socket to any valid IP address and the specified port
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = INADDR_ANY; // Bind to all local interfaces
local_addr.sin_port = htons(PORT);
while (1) {
socklen_t addr_len = sizeof(multicast_addr);
n = recvfrom(sock_fd, buffer, BUFFER_SIZE - 1, 0, (struct sockaddr
*)&multicast_addr, &addr_len);
if (n < 0) {
perror("recvfrom");
close(sock_fd);
exit(EXIT_FAILURE);
}
buffer[n] = '\0'; // Null-terminate the received message
printf("Received: %s", buffer);
}
// Clean up
close(sock_fd);
return 0;
}
Multiplexing
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/select.h>
int main() {
int server_fd, client_fd, max_sd, activity, sd;
int client_sockets[MAX_CLIENTS];
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
char buffer[BUFFER_SIZE];
while (1) {
fd_set readfds;
if (FD_ISSET(sd, &readfds)) {
int n = recv(sd, buffer, sizeof(buffer), 0);
if (n <= 0) {
// Client disconnected
printf("Client disconnected\n");
close(sd);
client_sockets[i] = 0;
} else {
buffer[n] = '\0'; // Null-terminate the received string
printf("Received: %s", buffer);
}
}
}
}
// Clean up
close(server_fd);
return 0;
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/select.h>
int main() {
int sock_fd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// Create socket
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// Connect to server
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
while (1) {
// Use select to wait for user input or server response
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(sock_fd, &readfds);
FD_SET(STDIN_FILENO, &readfds);
// Clean up
close(sock_fd);
return 0;
}
Multithreading
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
char buffer[BUFFER_SIZE];
ssize_t n;
while ((n = recv(sock, buffer, sizeof(buffer) - 1, 0)) > 0) {
buffer[n] = '\0'; // Null-terminate the received string
printf("Received: %s", buffer);
if (n == 0) {
printf("Client disconnected\n");
} else {
perror("recv");
}
close(sock);
return NULL;
}
int main() {
int server_fd, *client_socket;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
while (1) {
client_socket = malloc(sizeof(int));
*client_socket = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
if (*client_socket == -1) {
perror("accept");
free(client_socket);
continue;
}
printf("Accepted connection from client\n");
close(server_fd);
return 0;
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int sock_fd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// Create socket
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// Connect to server
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
while (1) {
// Read input from user
printf("> ");
fgets(buffer, BUFFER_SIZE, stdin);
// Clean up
close(sock_fd);
return 0;
}
Openssl
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
void handle_errors() {
ERR_print_errors_fp(stderr);
abort();
}
int main() {
SSL_CTX *ctx;
SSL *ssl;
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
char buffer[BUFFER_SIZE];
// Initialize OpenSSL
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ctx = SSL_CTX_new(TLS_server_method());
if (!ctx) {
handle_errors();
}
// Load certificates
if (SSL_CTX_use_certificate_file(ctx, "server.crt", SSL_FILETYPE_PEM) <= 0 ||
SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0) {
handle_errors();
}
while (1) {
// Accept incoming connection
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
if (client_fd < 0) {
perror("accept");
continue;
}
// Cleanup
SSL_free(ssl);
close(client_fd);
}
// Clean up
SSL_CTX_free(ctx);
close(server_fd);
return 0;
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
void handle_errors() {
ERR_print_errors_fp(stderr);
abort();
}
int main() {
SSL_CTX *ctx;
SSL *ssl;
int sock_fd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// Initialize OpenSSL
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ctx = SSL_CTX_new(TLS_client_method());
if (!ctx) {
handle_errors();
}
// Create socket
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// Connect to server
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
// Cleanup
SSL_free(ssl);
close(sock_fd);
SSL_CTX_free(ctx);
return 0;
}
P2P
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
char *filename = "shared_file.txt";
// Create socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
while (1) {
// Accept an incoming connection
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
if (client_fd == -1) {
perror("accept");
continue;
}
printf("Client connected.\n");
// Clean up
fclose(fp);
close(client_fd);
}
close(server_fd);
return 0;
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int n;
while ((n = recv(socket, buffer, BUFFER_SIZE, 0)) > 0) {
fwrite(buffer, sizeof(char), n, fp);
memset(buffer, 0, BUFFER_SIZE);
}
fclose(fp);
}
int main() {
int sock_fd;
struct sockaddr_in server_addr;
// Create socket
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// Clean up
close(sock_fd);
return 0;
}