#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cerrno>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
// Step 1: Create a socket
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == -1) {
perror("Error creating socket");
exit(EXIT_FAILURE);
}
// Step 2: Bind the socket to an IP address and port
sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY; // Accept connections on any interface
serverAddress.sin_port = htons(8080); // Use port 8080
if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1) {
perror("Error binding socket");
close(serverSocket);
exit(EXIT_FAILURE);
}
// Step 3: Listen for incoming connections
if (listen(serverSocket, 10) == -1) {
perror("Error listening for connections");
close(serverSocket);
exit(EXIT_FAILURE);
}
std::cout << "Server listening on port 8080..." << std::endl;
// Step 4: Accept incoming connections
sockaddr_in clientAddress;
socklen_t clientAddressLength = sizeof(clientAddress);
int clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddress, &clientAddressLength);
if (clientSocket == -1) {
perror("Error accepting connection");
close(serverSocket);
exit(EXIT_FAILURE);
}
std::cout << "Connection accepted from " << inet_ntoa(clientAddress.sin_addr) << ":" << ntohs(clientAddress.sin_port) << std::endl;
// Step 5: Send and receive data
char buffer[1024];
ssize_t bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);
if (bytesRead == -1) {
perror("Error receiving data");
} else {
std::cout << "Received data from client: " << std::string(buffer, bytesRead) << std::endl;
}
const char* message = "Hello from server!";
ssize_t bytesSent = send(clientSocket, message, strlen(message), 0);
if (bytesSent == -1) {
perror("Error sending data");
} else {
std::cout << "Sent data to client: " << message << std::endl;
}
// Step 6: Close the sockets
close(clientSocket);
close(serverSocket);
return 0;
}