Creo y guardo el código.
$ nano server.cpp
control + x
enter
Compilo:
$ g++ server.cpp -o server
Doy permisos:
$ chmod +775 server
Ejecuto:
$ ./server 8080
Conecto al server:
$ netcat 127.0.0.1 8080
Envio comando prueba 1:
ls
Envio comando prueba 2:
ls
Envio comando prueba 3:
ls
Ya no lo recibe.
Envio comando prueba 4:
broken pipe
Pruebo por si el server siguiese up:
$ netcat 127.0.0.1 8080
connection refused.
La aplicación se paró pero no encuentro el motivo.
Código
#include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> using namespace std; void callback(int); int main(int argc, char *argv[]) { int handlerSocket = 0; int newHandlerSocket = 0; int puerto = 0; int TamIP_Cliente = 0; int procesoHijo = 0; unsigned short int MAX_QUEUE = 5; unsigned short int ARGUMENTOS_MIN = 2; signed short int ERROR = -1; struct sockaddr_in IP_Servidor, IP_Cliente; /* Comprueba que no falta el argumento cli */ if (argc < ARGUMENTOS_MIN) { cout << "Puerto de escucha no especificado.\nAñade el puerto de escucha como parámetro en la llamada. Ejemplo:\n./server 8080"; exit(1); } handlerSocket = socket(AF_INET, SOCK_STREAM, 0); if (handlerSocket == ERROR) { cout << "No se pudo crear el socket."; exit(1); } /* Formatea el buffer */ bzero((char *) &IP_Servidor, sizeof(IP_Servidor)); /* Obtiene el argumento por cli */ puerto = atoi(argv[1]); /* socket IPV4 */ IP_Servidor.sin_family = AF_INET; /* Enlaza a cualquier dirección local disponible */ IP_Servidor.sin_addr.s_addr = INADDR_ANY; /* Fuerza que se utilice el orden correcto en la dirección de memoría */ IP_Servidor.sin_port = htons(puerto); if (::bind(handlerSocket, (struct sockaddr *) &IP_Servidor, sizeof(IP_Servidor)) == ERROR) { cout << "Error enlazando el servidor"; exit(1); } listen(handlerSocket, MAX_QUEUE); TamIP_Cliente = sizeof(IP_Cliente); while (1) { newHandlerSocket = accept(handlerSocket, (struct sockaddr *) &IP_Cliente, &TamIP_Cliente); if (handlerSocket == ERROR) { cout << "Error creando nuevo socket"; exit(1); } procesoHijo = fork(); if (procesoHijo == ERROR) { cout << "Error duplicando proceso."; exit(1); } if (procesoHijo != ERROR) { close(handlerSocket); callback(newHandlerSocket); exit(0); } else { close(newHandlerSocket); } } return 0; } void callback (int sock) { signed short int n; signed short int ERROR = -1; char buffer[128000]; bzero(buffer,128000); n = read(sock,buffer,128000); if (n < ERROR) { cout << "El handler del socket contiene errores"; exit(1); } cout << "Respuesta:" << endl << buffer << endl; n = write(sock,"Recivido.",9); /* Básico. Modificar por popen(); traer sh o incluir intérprete */ system(buffer); if (n < ERROR) { cout << "No se pudo escribir en el socket."; exit(1); } }