Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
29 views

Socket Programming

Uploaded by

uzairch514
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)
29 views

Socket Programming

Uploaded by

uzairch514
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/ 13

Computer Networks

Socket Programming

Question # 1

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

#define SERVER_IP "127.0.0.1" // Server IP address


#define SERVER_PORT 12345 #define
BUFFER_SIZE 1024

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

// Create a UDP socket


sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) { perror("Error in
socket creation");
exit(1);
}

// Configure server address


memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(SERVER_PORT);

while (1) {
// Get a message from the client's console and send it to the server
printf("Client: ");
fgets(buffer, BUFFER_SIZE, stdin);
if (buffer[0] == 'q') {
break;
}

// Send the message to the server


sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));

// Receive data from the server


ssize_t recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, NULL, NULL);
if (recv_len < 0) {
perror("Error in recvfrom");
exit(1);
}

// Null-terminate the received data


buffer[recv_len] = '\0';

// Display the message received from the server


printf("Server: %s\n", buffer);
}

close(sockfd);
return 0; }

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

#define SERVER_PORT 12345 #define


BUFFER_SIZE 1024

int main() {
int sockfd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[BUFFER_SIZE];

// Create a UDP socket


sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) { perror("Error in socket
creation"); exit(1);
}

// Configure server address


memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(SERVER_PORT);

// Bind the socket to the server address


if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Error in binding");
exit(1);
}

printf("UDP chat server is running on port %d...\n", SERVER_PORT);

while (1) {
// Receive data from a client ssize_t recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0,
(struct sockaddr *)&client_addr,
&client_len); if (recv_len < 0) {
perror("Error in recvfrom");
exit(1);
}

// Null-terminate the received data


buffer[recv_len] = '\0';

// Display the message received from the client


printf("Client %s:%d: %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port),
buffer);

// Get a message from the server's console and send it to the client
printf("Server: ");
fgets(buffer, BUFFER_SIZE, stdin);
if (buffer[0] == 'q') {
break;
}

// Send the message to the client


sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&client_addr, client_len);
}

close(sockfd);
return 0;
}
Output:
Question # 2
Client Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define SERVER_IP "127.0.0.1" // Server IP address


#define SERVER_PORT 12345
#define BUFFER_SIZE 1024

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

// Create a TCP socket sockfd =


socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error in socket creation");
exit(1);
}

// Configure server address


memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(SERVER_PORT);

// Connect to the server


if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Error in connecting to server"); exit(1);
}
while (1) {
// Get a message from the client's console and send it to the server
printf("Client: Enter a message to send to the server (or 'q' to quit): ");
fgets(buffer, BUFFER_SIZE, stdin);

if (buffer[0] == 'q') {
break;
}

// Send the message to the server


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

// Receive data from the server


ssize_t recv_len = recv(sockfd, buffer, BUFFER_SIZE, 0);
if (recv_len < 0) { perror("Error in recv");
exit(1);
} else if (recv_len == 0) {
printf("Server disconnected.\n");
break;
}

// Null-terminate the received data


buffer[recv_len] = '\0';

// Display the message received from the server


printf("Server: %s\n", buffer);
}

close(sockfd);
return 0;
}

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

#define SERVER_PORT 12345


#define BUFFER_SIZE 1024

int main() { int sockfd,


client_sockfd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[BUFFER_SIZE];

// Create a TCP socket


sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error in socket creation");
exit(1);
}

// Configure server address


memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(SERVER_PORT);

// Bind the socket to the server address


if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Error in binding"); exit(1);
}

// Listen for incoming connections


if (listen(sockfd, 5) < 0) {
perror("Error in listening");
exit(1);
}

printf("TCP chat server is running on port %d...\n", SERVER_PORT);

// Accept a client connection


client_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len); if (client_sockfd < 0) {
perror("Error in accepting connection");
exit(1);
}

while (1) {
// Receive data from the client
ssize_t recv_len = recv(client_sockfd, buffer, BUFFER_SIZE, 0);
if (recv_len < 0) { perror("Error in recv"); exit(1);
} else if (recv_len == 0) {
printf("Client disconnected.\n");
break;
}

// Null-terminate the received data


buffer[recv_len] = '\0';

// Display the message received from the client


printf("Client: %s\n", buffer);

// Get a message from the server's console and send it to the client
printf("Server: Enter a message to send to the client (or 'q' to quit): ");
fgets(buffer, BUFFER_SIZE, stdin);

if (buffer[0] == 'q') {
break;
}

// Send the message to the client


send(client_sockfd, buffer, strlen(buffer), 0);
}

close(client_sockfd);
close(sockfd);
return 0;
}
Output:
Analysis and Evaluation: UDP:
• Connectionless, low overhead.
• No guaranteed delivery, lower latency.
• Suitable for real-time applications.
• No reliability guarantees, needs custom error handling.
TCP:
• Connection-oriented, higher overhead.
• Guaranteed delivery, ordered data.
• Suitable for reliable data transfer.
• Built-in error handling and correction.
Choose UDP for low-latency real-time applications, and TCP for reliable, ordered data transfer.

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

#define SERVER_IP "127.0.0.1"


#define SERVER_PORT 5354
#define BUFFER_SIZE 1024

int main() {
int sockfd;
struct
sockaddr_in
server_addr;
socklen_t server_len = sizeof(server_addr);
char buffer[BUFFER_SIZE];
const char *ip_address;

// Create a UDP socket for the DNS client


sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("Error in socket creation");
exit(1);
}

// Configure server address


memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(SERVER_PORT);

// Query the DNS server for a hostname


printf("Enter a hostname to query the DNS server: ");
fgets(buffer, BUFFER_SIZE, stdin);

// Remove the newline character from the input


buffer[strcspn(buffer, "\n")] = '\0'; // Remove '\n'

// Send the DNS query (hostname) to the server


sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&server_addr, server_len);

// Receive and display the IP address from the server


ssize_t recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, NULL, NULL);
if (recv_len < 0) { perror("Error in recvfrom"); exit(1);
}

buffer[recv_len] = '\0';
printf("Resolved IP address: %s\n", buffer);

close(sockfd);
return 0;
}

Server Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 5354
#define BUFFER_SIZE 1024

// Structure to hold DNS mappings


struct DNSMapping { const char
*hostname;
const char *ip_address;
};

// DNS mappings for common social media sites struct


DNSMapping dns_mappings[] = {
{"www.facebook.com", "192.168.1.10"},
{"www.twitter.com", "192.168.1.20"},
{"www.instagram.com", "192.168.1.30"},
{"www.linkedin.com", "192.168.1.40"},
{"www.youtube.com", "192.168.1.50"},
{"www.reddit.com", "192.168.1.60"},
{"www.pinterest.com", "192.168.1.70"},
{"www.tumblr.com", "192.168.1.80"},
{"www.snapchat.com", "192.168.1.90"},
{"www.whatsapp.com", "192.168.1.100"},
{NULL, NULL} // End of the mapping list
};

// Function to resolve a hostname to an IP address const char


*resolve_hostname(const char *hostname) { for (int i = 0;
dns_mappings[i].hostname != NULL; i++) { if
(strcmp(hostname, dns_mappings[i].hostname) == 0) {
return dns_mappings[i].ip_address;
}
}
return "Unknown";
}

int main() {
int sockfd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[BUFFER_SIZE];
const char *ip_address;

// Create a UDP socket for the DNS server


sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("Error in socket creation");
exit(1);
}

// Configure server address


memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(SERVER_PORT);

// Bind the socket to the server address


if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Error in binding"); exit(1);
}

printf("DNS server is running on IP %s and port %d...\n", SERVER_IP, SERVER_PORT);

while (1) {
// Receive DNS query from the client
ssize_t recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&client_addr,
&client_len);
if (recv_len < 0) {
perror("Error in recvfrom");
exit(1);
}

// Null-terminate the received data


buffer[recv_len] = '\0';

// Resolve the received hostname to an IP address


ip_address = resolve_hostname(buffer);

// Send the IP address back to the client


sendto(sockfd, ip_address, strlen(ip_address), 0, (struct sockaddr *)&client_addr, client_len);
printf("Resolved %s to %s\n", buffer, ip_address);
}

close(sockfd);
return 0;
}

Output:

You might also like