elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  No puedo procesar datos recibidos de socket como un bloque
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No puedo procesar datos recibidos de socket como un bloque  (Leído 2,402 veces)
harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
No puedo procesar datos recibidos de socket como un bloque
« en: 4 Diciembre 2014, 02:24 am »

Hola. Estoy desarrollando algo que podría llamarse "shell remota" porque recibe comandos desde una máquina externa. En realidad es una computadora que está a la escucha de comandos, los interpreta y devuelve un resultado.

El problema está en que yo quiero recibir los carácteres recibidos como un bloque, es decir, como un comando completo. Pero cuando lo intento, pareciera ser que voy recibiendo byte a byte, en vez de toda la informacion transmitida.

Por favor, si pueden ayudarme estaría muy agradecido. Adjunto el código para que vean que el receptor no puede interpretar el comando "ATTACK".

Código
  1. /* Enlazar Ws2_32 */
  2. #define _WIN32_WINNT 0x0501
  3. #include <stdio.h>
  4. #include <winsock2.h>
  5. #define PUERTO 8080
  6.  
  7. WSADATA wsa_data;
  8. SOCKET listen_socket, cliente;
  9. struct sockaddr_in clientinfo, servicio;
  10. int rtn;
  11. char buffer[256];
  12.  
  13. void print_buffer(char *buffer, unsigned int bytes) {
  14.    while(bytes--)
  15.        putchar(*buffer++);
  16.  
  17. }
  18.  
  19. int main() {
  20.    if ((rtn = WSAStartup(MAKEWORD(2,2), &wsa_data)) != 0) {
  21.        fprintf(stderr, "Error WSAStartup: %d\n", rtn);
  22.        return 1;
  23.    }
  24.  
  25.    if((listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
  26.        fprintf(stderr, "Error en socket: %d\n", WSAGetLastError());
  27.        WSACleanup();
  28.        return 1;
  29.    }
  30.  
  31.    servicio.sin_family = AF_INET;
  32.    servicio.sin_addr.S_un.S_addr = INADDR_ANY;
  33.    servicio.sin_port = htons(PUERTO);
  34.  
  35.    if((rtn = bind(listen_socket, (struct sockaddr*) &servicio, (int) sizeof(servicio))) == SOCKET_ERROR) {
  36.        fprintf(stderr, "Error en bind: %d\n", WSAGetLastError());
  37.        WSACleanup();
  38.        return 1;
  39.    }
  40.  
  41.    if (listen(listen_socket, SOMAXCONN) == SOCKET_ERROR) {
  42.        fprintf(stderr, "Error en listen: %d\n", WSAGetLastError());
  43.        closesocket(listen_socket);
  44.        WSACleanup();
  45.        return 1;
  46.    }
  47.  
  48.    if((cliente = accept(listen_socket, (struct sockaddr*)&clientinfo, NULL)) == INVALID_SOCKET) {
  49.        fprintf(stderr, "Error en accept: %d\n", WSAGetLastError());
  50.        closesocket(listen_socket);
  51.        WSACleanup();
  52.        return 1;
  53.    }
  54.  
  55.    closesocket(listen_socket);
  56.  
  57.    printf("Cliente IP: %s\n", inet_ntoa(clientinfo.sin_addr));
  58.  
  59.    do {
  60.        rtn = recv(cliente, buffer, sizeof(buffer), 0);
  61.  
  62.        if(rtn > 0) {
  63.            print_buffer(buffer, rtn);
  64.            if(strcmp(buffer, "ATTACK") == 0){
  65.                printf("ATTACK COMMAND ISSUED!!\n");
  66.            }
  67.        } else if(rtn == 0)
  68.            printf("Cerrando la conexión...\n");
  69.        else {
  70.            fprintf(stderr, "Error en recv: %d\n", WSAGetLastError());
  71.            closesocket(cliente);
  72.            WSACleanup();
  73.            return 1;
  74.        }
  75.    } while(rtn > 0);
  76.  
  77.    closesocket(cliente);
  78.    WSACleanup();
  79.  
  80.    return 0;
  81. }
  82.  
  83.  


En línea

Vista mi blog es enriquemesa.blogspot.com
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: No puedo procesar datos recibidos de socket como un bloque
« Respuesta #1 en: 4 Diciembre 2014, 12:52 pm »

Tendrás que leer hasta tener un mínimo de bytes, guardándolo todo en una variable. Tras tener la cantidad mínima que necesitas, ya podrás hacer lo que tengas que hacer con ello.


En línea

harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Re: No puedo procesar datos recibidos de socket como un bloque
« Respuesta #2 en: 4 Diciembre 2014, 22:36 pm »

Gracias ivancea96. He implementado una solucion que va contando cada paquete de bytes y los concatena hasta encontrar un CR. Gracias por tu ayuda.
En línea

Vista mi blog es enriquemesa.blogspot.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines