intmain(){ // Create a server socket int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { perror("Error creating server socket"); exit(EXIT_FAILURE); }
// Set up the server address structure sockaddr_in serverAddress; serverAddress.sin_family = AF_INET; serverAddress.sin_addr.s_addr = INADDR_ANY; serverAddress.sin_port = htons(12345); // Port number
// Bind the server socket if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1) { perror("Error binding server socket"); close(serverSocket); exit(EXIT_FAILURE); }
// 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 12345...\n";
// Set of socket descriptors fd_set readfds; FD_ZERO(&readfds);
// Add the server socket to the set FD_SET(serverSocket, &readfds);
while (true) { // Copy the set of file descriptors fd_set tmpReadfds = readfds;
// Use select to monitor socket activity if (select(FD_SETSIZE, &tmpReadfds, nullptr, nullptr, nullptr) == -1) { perror("Error in select"); break; }
// Check each socket for activity for (int i = 0; i < FD_SETSIZE; ++i) { if (FD_ISSET(i, &tmpReadfds)) { // New connection if (i == serverSocket) { // Accept the new connection int clientSocket = accept(serverSocket, nullptr, nullptr); if (clientSocket == -1) { perror("Error accepting connection"); } else { std::cout << "New connection established. Socket FD: " << clientSocket << "\n"; FD_SET(clientSocket, &readfds); clientSockets.insert(clientSocket); } } else { // Data from a client char buffer[1024]; int bytesRead = recv(i, buffer, sizeof(buffer), 0);
if (bytesRead <= 0) { // Connection closed or error if (bytesRead == 0) { std::cout << "Client " << i << " disconnected.\n"; } else { perror("Error receiving data"); }
// Remove the socket from the set and close it close(i); FD_CLR(i, &readfds); clientSockets.erase(i); } else { // Display received data buffer[bytesRead] = '\0'; std::cout << "Received data from client " << i << ": " << buffer << "\n"; } } } } }
// Close all client sockets for (int clientSocket : clientSockets) { close(clientSocket); }
intmain(){ // Create a server socket int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { perror("Error creating server socket"); exit(EXIT_FAILURE); }
// Set up the server address structure sockaddr_in serverAddress; serverAddress.sin_family = AF_INET; serverAddress.sin_addr.s_addr = INADDR_ANY; serverAddress.sin_port = htons(12345); // Port number
// Bind the server socket if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1) { perror("Error binding server socket"); close(serverSocket); exit(EXIT_FAILURE); }
// 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 12345...\n";
// Prepare the pollfd structures std::vector<pollfd> fds; fds.push_back({serverSocket, POLLIN, 0}); // Add server socket to the vector
while (true) { // Call poll to wait for events on the sockets int activity = poll(fds.data(), fds.size(), -1); if (activity == -1) { perror("Error in poll"); break; }
// Check if the server socket has an incoming connection if (fds[0].revents & POLLIN) { int clientSocket = accept(serverSocket, nullptr, nullptr); if (clientSocket == -1) { perror("Error accepting connection"); } else { std::cout << "New connection established. Socket FD: " << clientSocket << "\n"; fds.push_back({clientSocket, POLLIN, 0}); // Add new client socket to the vector } }
// Check for input from clients for (size_t i = 1; i < fds.size(); ++i) { if (fds[i].revents & POLLIN) { char buffer[1024]; int bytesRead = recv(fds[i].fd, buffer, sizeof(buffer), 0);
// API intepoll_create(int size); intepoll_ctl(int epfd, int op, int fd, struct epoll_event *event); intepoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
intmain(){ int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { std::cerr << "Error: Could not create server socket\n"; return1; }
if (bind(serverSocket, reinterpret_cast<sockaddr*>(&serverAddress), sizeof(serverAddress)) == -1) { std::cerr << "Error: Could not bind to port " << PORT << "\n"; close(serverSocket); return1; }
if (listen(serverSocket, SOMAXCONN) == -1) { std::cerr << "Error: Could not listen on socket\n"; close(serverSocket); return1; }
int epollFd = epoll_create1(0); if (epollFd == -1) { std::cerr << "Error: Failed to create epoll file descriptor\n"; close(serverSocket); return1; }