Problema con sockets en c

Iniciado por Frijolito, Octubre 26, 2018, 12:28:26 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Octubre 26, 2018, 12:28:26 AM Ultima modificación: Octubre 26, 2018, 01:24:19 PM por Frijolito
Hola, la verdad estoy haciendo un programa que la gracia es que me diga el nombre el pc, el user actual, el sistema operativo y la ip de donde se esta ejecutando el servidor pero no se porque no funciona, los mensajes no llegan. Ademas copie el codigo de otro servidor que estaba haciendo porque la primera parte es la misma. Esta hecho en Linux Ubuntu, si me pueden ayudar de verdad los amaria e estado todo el dia partiéndome la cabeza con esto.

servidor:
Código: c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/wait.h>

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>

#define PUERTO 15560
#define MAXCLIENT 3


int shell(int sock_client, struct sockaddr_in client, struct sockaddr_in server);

int main(){

    fd_set rfds;        // Conjunto de descriptores a vigilar
   
    int sock_host;
    int sock_client;

    int childpid;
    int codigo_de_salida;
    int childcount = 0;
    int pidstatus;

    socklen_t longclient;
   
    sock_host = socket(AF_INET,SOCK_STREAM,0);
   
    struct sockaddr_in server, client;
    bzero((char *)&server, sizeof(server));
    server.sin_family       = AF_INET;
    server.sin_port         = htons(PUERTO);
    server.sin_addr.s_addr  = INADDR_ANY;

    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 500;    //Tiempo de espera
     
    if(bind(sock_host, (struct sockaddr *)&server, sizeof(server)) < 0){ //asignamos un puerto al socket
        printf("  [!!]Error al asociar el puerto a la conexion\n");
        close(sock_host);
        return 1;
    }

    if(listen(sock_host, 10) == -1){
        printf("  [!!]No se pude escuchar en el puerto seleccionado\n");
    }
   
    longclient = sizeof(client);
    while(free){

        //Selec se carga con el valor de rfds

        FD_ZERO(&rfds);
        FD_SET(sock_host, &rfds);

        if(select(sock_host+1, &rfds, NULL, NULL, &tv)){
            if(sock_client = accept(sock_host, (struct sockaddr *)&client, &longclient) != -1){

            printf("[>>] Conectando con %s\n", inet_ntoa(client.sin_addr));
                switch (childpid = fork()){
                    case -1:
                        printf("  [!!]Error al crear el thread\n");break;
                    case  0:
                        if(childcount < MAXCLIENT){
                        shell(sock_client, client, server);
                        }else{
                        printf("  [!!]Ya estas conectado");
                        }
                        break;
                    default:
                        childcount++;
                        close(sock_client);
                        break;
                }
            }else{
                printf("  [!!]Error al intentar aceptar la conexion\n");
            }
        }
        childpid = waitpid(0, &pidstatus, WNOHANG);

        if(childpid>0){
            childcount--;    //Acaba de desconectarse un cliente
        }
    }
    return 0;
}

int shell(int sock_client, struct sockaddr_in client, struct sockaddr_in server){

char comando[512];

char *pc = getenv("COMPUTERNAME");
char *user = getenv("USER");
char os[512] = "Aun no se hacer eso. \n";
char *ip = inet_ntoa(server.sin_addr);

sleep(1);

printf("  [>>] En la funcion shell\n");

write(sock_client, "    [>>] Listo para recivir informacion \n",42);

while(free){

bzero(comando, 512);
read(sock_client, comando, strlen(comando));
printf("%s",comando );

if(strncmp(comando, "info", 4) == 0){

printf("[>>] Enviando la informacion\n");

send(sock_client, pc, strlen(pc),0);
send(sock_client, user, strlen(user),0);
send(sock_client, os, strlen(os), 0);
send(sock_client, ip, strlen(ip),0);

}
}
return 0;
}


cliente:
Código: c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
     
#define BUFFSIZE 1
#define PUERTO 15560
     
int shell (int sock_client, struct sockaddr_in client);
     
int main(){
     
    char buffer[512];
    int sock_client;
    sock_client = socket(AF_INET,SOCK_STREAM,0);
     
    struct hostent *server;
    server = gethostbyname("localhost");
     
    struct sockaddr_in client;
    bzero((char *)&client, sizeof(client));
    client.sin_family       = AF_INET;
    client.sin_port         = htons(PUERTO);
    client.sin_addr     = *((struct in_addr *)server->h_addr);
     
    if(connect(sock_client,(struct sockaddr *)&client, sizeof(client)) < 0){
        printf("Error al conectar con el host\n");
        return 1;
    }

    printf("[>>] Conectando con %s",inet_ntoa(client.sin_addr));
    printf("\n");
   
    read(sock_client, buffer, 512);

    shell(sock_client, client);
printf("%s", buffer);
}

int shell(int sock_client, struct sockaddr_in client){

char command[512];

char help[512] = "help";
char close[512] = "close";
char info[512] = "info";
char clear[512] = "clear";
char HELP[1024] = "\n  [HELP MENU] \n    [HELP - Muestra este menu]\n    [Close - Cierra el menu]\n    [Info - Muestra informacion del target]\n    [Clear - Limpea la terminal ]\n\n";

char PC[512];
char USER[512];
char OS[512];
char IP[512];

char *p = getenv("USER");
printf(" [>>] Sesion de Shell iniciada. \n");
read(sock_client, command, 512);
printf("%s", command );

while(free){
printf("   %s@%s:~$ ",p , inet_ntoa(client.sin_addr));
bzero(command, 512);
fgets(command, 512 , stdin);

write(sock_client, command, 512);
printf("%s", command);

if(strncmp(command,help,4) == 0){
printf("%s",HELP);
}
if(strncmp(command,close,5) == 0){
write(sock_client, close , strlen(close));
printf("[>>] Cerrardo... \n");
exit(1);
}
if(strncmp(command,info,4) == 0){
printf("    [>>]Esperando la informacion. \n");

read(sock_client, PC,   512);
read(sock_client, USER, 512);
read(sock_client, OS,   512);
read(sock_client, IP,   512);

printf("      El PC es    -- %s\n", PC    );
printf("      El USER es  -- %s\n", USER  );
printf("      El OS es    -- %s\n", OS    );
printf("      la IP es    -- %s\n\n", IP  );

}
if(strncmp(command,clear,5) == 0){
system("clear");
}
}
return 0;
}


Lo primero que veo es que nunca lee los datos del servidor por que llegada esa instancia la variable intentos nunca es mayor a 0:

Código: c
   int intentos = 0;

                        if(intentos > 0){

                                read(sock_client, PC,   512);
                                read(sock_client, USER, 512);
                                read(sock_client, OS,   512);
                                read(sock_client, IP,   512);
                        }

                        intentos++;


Saludos,

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Lo primero que veo es que nunca lee los datos del servidor por que llegada esa instancia la variable intentos nunca es mayor a 0:

Código: c
   int intentos = 0;

                        if(intentos > 0){

                                read(sock_client, PC,   512);
                                read(sock_client, USER, 512);
                                read(sock_client, OS,   512);
                                read(sock_client, IP,   512);
                        }

                        intentos++;


Saludos,

Saque esa parte en cuanto lo vi, pero sigue sin funcionar, me falto editar el post lo cambio altiro

Qué te muestra el client cuando entras a shell?

Eso me muestra

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Octubre 26, 2018, 02:27:58 PM #5 Ultima modificación: Octubre 26, 2018, 03:59:07 PM por solid water
Haceme un favor subile los tiempos de espera en el server y el client a ver que pasa:

struct timeval tv;
tv.tv_sec = 6;
tv.tv_usec = 3000;
setsockopt(sock_client, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);

Me parece que puede ser el mismo problema que tenía yo.

Saludos,

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Haceme un favor subile los tiempos de espera en el server y el client a ver que pasa:

struct timeval tv;
tv.tv_sec = 6;
tv.tv_usec = 3000;
setsockopt(sock_client, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);

Me parece que puede ser el mismo problema que tenía yo.

Saludos,

Lo hice y sigue sin funcionar la verdad ya no se que puede ser