StringManolo

cppshell

Mar 29th, 2020
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <unistd.h>
  6.  
  7. using namespace std;
  8.  
  9. void callback(int);
  10.  
  11. int main(int argc, char *argv[]) {
  12.   int handlerSocket = 0;
  13.   int newHandlerSocket = 0;
  14.   int puerto = 0;
  15.   int TamIP_Cliente = 0;
  16.   int procesoHijo = 0;
  17.  
  18.   unsigned short int MAX_QUEUE = 5;
  19.   unsigned short int ARGUMENTOS_MIN = 2;
  20.   signed short int ERROR = -1;
  21.  
  22.   struct sockaddr_in IP_Servidor, IP_Cliente;
  23.  
  24. /* Numero máximo de conexiones en la cola. */
  25.   if (argc < ARGUMENTOS_MIN) {
  26.     cout << "Puerto de escucha no especificado.\nAñade el puerto de escucha como parámetro en la llamada. Ejemplo:\n./server 8080";
  27.     exit(1);
  28.   }
  29.  
  30.   handlerSocket = socket(AF_INET, SOCK_STREAM, 0);
  31.  
  32.   if (handlerSocket == ERROR) {
  33.     cout << "No se pudo crear el socket.";
  34.     exit(1);
  35.   }
  36.  
  37.   /* Formatea el buffer */
  38.   bzero((char *) &IP_Servidor, sizeof(IP_Servidor));
  39.  
  40.   /* Obtiene el argumento por cli */
  41.   puerto = atoi(argv[1]);
  42.  
  43.   /* socket IPV4 */
  44.   IP_Servidor.sin_family = AF_INET;
  45.  
  46.   /* Enlaza a cualquier dirección local disponible */
  47.   IP_Servidor.sin_addr.s_addr = INADDR_ANY;
  48.  
  49.   /* Fuerza que se utilice el orden correcto en la dirección de memoría */
  50.   IP_Servidor.sin_port = htons(puerto);
  51.  
  52.   if (::bind(handlerSocket, (struct sockaddr *) &IP_Servidor, sizeof(IP_Servidor)) == ERROR) {
  53.     cout << "Error enlazando el servidor";
  54.     exit(1);
  55.   }
  56.  
  57.   listen(handlerSocket, MAX_QUEUE);
  58.   TamIP_Cliente = sizeof(IP_Cliente);
  59.   while (1) {
  60.     newHandlerSocket = accept(handlerSocket, (struct sockaddr *) &IP_Cliente, &TamIP_Cliente);
  61.  
  62.     if (handlerSocket == ERROR) {
  63.       cout << "Error creando nuevo socket";
  64.       exit(1);
  65.     }
  66.  
  67.     procesoHijo = fork();
  68.  
  69.     if (procesoHijo == ERROR) {
  70.       cout << "Error duplicando proceso.";
  71.       exit(1);
  72.     }
  73.  
  74.     if (procesoHijo != ERROR) {
  75.       close(handlerSocket);
  76.       callback(newHandlerSocket);
  77.       exit(0);
  78.     } else {
  79.       close(newHandlerSocket);
  80.     }
  81.   }
  82. return 0;
  83. }
  84.  
  85. void callback (int sock) {
  86.   signed short int n;
  87.   signed short int ERROR = -1;
  88.   char buffer[128000];
  89.   bzero(buffer,128000);
  90.   n = read(sock,buffer,128000);
  91.  
  92.   if (n < ERROR) {
  93.     cout << "El handler del socket contiene errores";
  94.     exit(1);
  95.   }
  96.  
  97.   cout << "Respuesta:" << endl << buffer << endl;
  98.   n = write(sock,"Recivido.",9);
  99.  
  100.   /* Básico. Modificar por popen(); traer sh o incluir intérprete */
  101.   system(buffer);
  102.  
  103.   if (n < ERROR) {
  104.     cout << "No se pudo escribir en el socket.";
  105.     exit(1);
  106.   }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment