Advertisement
StringManolo

CppShellNotFinished

Mar 29th, 2020
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. /* A simple server in the internet domain using TCP The port number is passed as an argument This version runs forever, forking off a separate process for each connection gcc server2.c -lsocket */
  2.  
  3. #include <iostream>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7.  
  8. void callback(int);
  9.  
  10. int main(int argc, char *argv[]) {
  11.  
  12.   int handlerSocket = 0;
  13.   int newHandlerSocket = 0;
  14.   int puerto = 0;
  15.   int TamIP_Cliente = 0;
  16.   int procesoHijo = 0;
  17.  
  18.   int MAX_QUEUE = 5;
  19.   int ARGUMENTOS_MIN = 2;
  20.   int ERROR = -1;
  21.  
  22.   struct sockaddr_in IP_Servidor, IP_Cliente;
  23.  
  24. /* Numero máximo de conexiones en la cola. */
  25.  
  26.   if (argc < ARGUMENTOS_MIN) {
  27.     cout << "Puerto de escucha no especificado.\nAñade el puerto de escucha como parámetro en la llamada. Ejemplo:\n./server 127.0.0.1 8080";
  28.     exit(1);
  29.   }
  30.  
  31.   handlerSocket = socket(AF_INET, SOCK_STREAM, 0);
  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.  
  60.   while (1) {
  61.     newHandlerSocket = accept(handlerSocket, (struct sockaddr *) &IP_Cliente, &TamIP_Cliente);
  62.  
  63.     if (handlerSocket == ERROR) {
  64.       cout << "Error creando nuevo socket";
  65.       exit(1);
  66.     }
  67.  
  68.     procesoHijo = fork();
  69.  
  70.     if (procesoHijo == ERROR) {
  71.       cout << "Error duplicando proceso.";
  72.       exit(1);
  73.     }
  74.  
  75.     if (procesoHijo != ERROR) {
  76.       close(handlerSocket);
  77.       callback(newHandlerSocket);
  78.       exit(0);
  79.     } else {
  80.       close(newHandlerSocket);
  81.     }
  82.   }
  83.  
  84.   return 0;
  85.  
  86.   void callback (int sock) {
  87.     int n;
  88.     char buffer[256];
  89.     bzero(buffer,256);
  90.     n = read(sock,buffer,255);
  91.  
  92.     if (n < ERROR) {
  93.       cout << "El handler del socket contiene errores";
  94.       exit(1);
  95.     }
  96.  
  97.     cout << "Respuesta:" << endl << buffer;
  98.     n = write(sock,"Datos recividos",18);
  99.  
  100.     if (n < ERROR) {
  101.       cout << "No se pudo escribir en el socket.";
  102.       exit(1);
  103.     }
  104.   }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement