// File: janthonyo[P]Redes-Practicas/cliente.cc
// Function: main
int main (int argc, char const *argv[])
{
    if(argc != 2)
    {
        printf("-ERR. No ha introducido la IP del servidor.\n");
        exit(1);
    }

	/*----------------------------------------------------
		Descriptor del socket y buffer de datos
	-----------------------------------------------------*/
	int sd;
	struct sockaddr_in sockname;
	char buffer[250];
	socklen_t len_sockname;
    fd_set readfds, auxfds;
    int salida;
    int fin = 0;

    //Variables añadidas
    int numbers[100];
    int numbers_len = 0;


	/* --------------------------------------------------
		Se abre el socket
	---------------------------------------------------*/
  	sd = socket (AF_INET, SOCK_STREAM, 0);
	if (sd == -1)
	{
		perror("No se puede abrir el socket cliente\n");
    		exit (1);
	}



	/* ------------------------------------------------------------------
		Se rellenan los campos de la estructura con la IP del
		servidor y el puerto del servicio que solicitamos
	-------------------------------------------------------------------*/
	sockname.sin_family = AF_INET;
	sockname.sin_port = htons(2050);
	sockname.sin_addr.s_addr =  inet_addr(argv[1]);

	/* ------------------------------------------------------------------
		Se solicita la conexión con el servidor
	-------------------------------------------------------------------*/
	len_sockname = sizeof(sockname);

	if (connect(sd, (struct sockaddr *)&sockname, len_sockname) == -1)
	{
		perror ("Error de conexión");
		exit(1);
	}

    //Inicializamos las estructuras
    FD_ZERO(&auxfds);
    FD_ZERO(&readfds);

    FD_SET(0,&readfds);
    FD_SET(sd,&readfds);


	/* ------------------------------------------------------------------
		Se transmite la información (Parte a modificar)
	-------------------------------------------------------------------*/
	do
	{
        auxfds = readfds;
        salida = select(sd+1,&auxfds,NULL,NULL,NULL);

        //Tengo mensaje desde el servidor
        if(FD_ISSET(sd, &auxfds)){

            bzero(buffer,sizeof(buffer));
            recv(sd,buffer,sizeof(buffer),0);

            if(strcmp(buffer,"-ERR. Demasiados clientes conectados\n") == 0)
                fin =1;

            if(strcmp(buffer,"-ERR. Desconexion servidor\n") == 0)
                fin =1;

            if(strstr(buffer, "+Ok. Desconexion procesada\n") != NULL)
            {
                fin =1;
            }

            //Formatea de forma bonita las fichas
            numbers_len = 0;
            for (int i = 0; i < strlen(buffer); i++) {
                if (buffer[i]=='|') {
                    if( isdigit(buffer[i-1]) && isdigit(buffer[i+1]) ){
                        printf("·");
                    }
                    else{
                        printf("%c", buffer[i]);
                    }
                }
                else{
                    printf("%c", buffer[i]);
                }
            }

            for (int i = 0; i < numbers_len; i++) {
                printf("|%d·", numbers[i]);
                i++;
                printf("%d|\n", numbers[i]);
            }


        }
        else
        {

            //He introducido información por teclado
            /*(No hay que cambiarlo. El cliente escribe el numero de la opción
            que quiere escoger, este se manda al servidor y él lo interpreta.)*/
            if(FD_ISSET(0,&auxfds)){
                bzero(buffer,sizeof(buffer));
                fgets(buffer,sizeof(buffer),stdin);
                send(sd,buffer,sizeof(buffer),0);
            }


        }



    }while(fin == 0);

    close(sd);

    return 0;

}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x400, %rsp            # imm = 0x400
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpl $0x2, -0x8(%rbp)
je 0x1287
leaq 0xd8e(%rip), %rdi       # 0x2004
movb $0x0, %al
callq 0x1030
movl $0x1, %edi
callq 0x1110
movl $0x0, -0x230(%rbp)
movl $0x0, -0x3c4(%rbp)
movl $0x2, %edi
movl $0x1, %esi
xorl %edx, %edx
callq 0x1060
movl %eax, -0x14(%rbp)
cmpl $-0x1, -0x14(%rbp)
jne 0x12cb
leaq 0xd75(%rip), %rdi       # 0x2031
callq 0x10d0
movl $0x1, %edi
callq 0x1110
movw $0x2, -0x24(%rbp)
movl $0x802, %edi            # imm = 0x802
callq 0x1040
movw %ax, -0x22(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x1100
movl %eax, -0x20(%rbp)
movl $0x10, -0x124(%rbp)
movl -0x14(%rbp), %edi
movl -0x124(%rbp), %edx
leaq -0x24(%rbp), %rsi
callq 0x10c0
cmpl $-0x1, %eax
jne 0x1326
leaq 0xd3f(%rip), %rdi       # 0x2056
callq 0x10d0
movl $0x1, %edi
callq 0x1110
jmp 0x1328
leaq -0x228(%rbp), %rax
movq %rax, -0x3d0(%rbp)
movl $0x0, -0x3c8(%rbp)
movl -0x3c8(%rbp), %eax
cmpq $0x10, %rax
jae 0x1372
movq -0x3d0(%rbp), %rax
movl -0x3c8(%rbp), %ecx
movq $0x0, (%rax,%rcx,8)
movl -0x3c8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c8(%rbp)
jmp 0x1340
jmp 0x1374
jmp 0x1376
leaq -0x1a8(%rbp), %rax
movq %rax, -0x3e0(%rbp)
movl $0x0, -0x3d4(%rbp)
movl -0x3d4(%rbp), %eax
cmpq $0x10, %rax
jae 0x13c0
movq -0x3e0(%rbp), %rax
movl -0x3d4(%rbp), %ecx
movq $0x0, (%rax,%rcx,8)
movl -0x3d4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3d4(%rbp)
jmp 0x138e
jmp 0x13c2
movq -0x1a8(%rbp), %rax
orq $0x1, %rax
movq %rax, -0x1a8(%rbp)
movl -0x14(%rbp), %eax
movl $0x40, %ecx
cltd
idivl %ecx
movl %edx, %eax
movl %eax, %ecx
movl $0x1, %eax
shlq %cl, %rax
movq %rax, %rcx
movl -0x14(%rbp), %eax
movl $0x40, %esi
cltd
idivl %esi
cltq
orq -0x1a8(%rbp,%rax,8), %rcx
movq %rcx, -0x1a8(%rbp,%rax,8)
leaq -0x228(%rbp), %rdi
leaq -0x1a8(%rbp), %rsi
movl $0x80, %edx
callq 0x10b0
movl -0x14(%rbp), %edi
addl $0x1, %edi
leaq -0x228(%rbp), %rsi
xorl %eax, %eax
movl %eax, %r8d
movq %r8, %rdx
movq %r8, %rcx
callq 0x10f0
movl %eax, -0x22c(%rbp)
movl -0x14(%rbp), %eax
movl $0x40, %ecx
cltd
idivl %ecx
cltq
movq -0x228(%rbp,%rax,8), %rax
movq %rax, -0x3f0(%rbp)
movl -0x14(%rbp), %eax
movl $0x40, %ecx
cltd
idivl %ecx
movq -0x3f0(%rbp), %rax
movl %edx, %ecx
movl $0x1, %edx
shlq %cl, %rdx
movq %rdx, %rcx
andq %rcx, %rax
cmpq $0x0, %rax
je 0x1681
leaq -0x120(%rbp), %rdi
xorl %esi, %esi
movl $0xfa, %edx
callq 0x10a0
movl -0x14(%rbp), %edi
leaq -0x120(%rbp), %rsi
movl $0xfa, %edx
xorl %ecx, %ecx
callq 0x1070
leaq -0x120(%rbp), %rdi
leaq 0xba4(%rip), %rsi       # 0x2069
callq 0x1120
cmpl $0x0, %eax
jne 0x14d9
movl $0x1, -0x230(%rbp)
leaq -0x120(%rbp), %rdi
leaq 0xba8(%rip), %rsi       # 0x208f
callq 0x1120
cmpl $0x0, %eax
jne 0x14fb
movl $0x1, -0x230(%rbp)
leaq -0x120(%rbp), %rdi
leaq 0xba2(%rip), %rsi       # 0x20ab
callq 0x1050
cmpq $0x0, %rax
je 0x151e
movl $0x1, -0x230(%rbp)
movl $0x0, -0x3c4(%rbp)
movl $0x0, -0x3e4(%rbp)
movslq -0x3e4(%rbp), %rax
movq %rax, -0x3f8(%rbp)
leaq -0x120(%rbp), %rdi
callq 0x1080
movq %rax, %rcx
movq -0x3f8(%rbp), %rax
cmpq %rcx, %rax
jae 0x160f
movslq -0x3e4(%rbp), %rax
movsbl -0x120(%rbp,%rax), %eax
cmpl $0x7c, %eax
jne 0x15dc
movl -0x3e4(%rbp), %eax
subl $0x1, %eax
cltq
movsbl -0x120(%rbp,%rax), %edi
callq 0x10e0
cmpl $0x0, %eax
je 0x15bd
movl -0x3e4(%rbp), %eax
addl $0x1, %eax
cltq
movsbl -0x120(%rbp,%rax), %edi
callq 0x10e0
cmpl $0x0, %eax
je 0x15bd
leaq 0xb19(%rip), %rdi       # 0x20cd
movb $0x0, %al
callq 0x1030
jmp 0x15da
movslq -0x3e4(%rbp), %rax
movsbl -0x120(%rbp,%rax), %esi
leaq 0xaf4(%rip), %rdi       # 0x20c7
movb $0x0, %al
callq 0x1030
jmp 0x15f9
movslq -0x3e4(%rbp), %rax
movsbl -0x120(%rbp,%rax), %esi
leaq 0xad5(%rip), %rdi       # 0x20c7
movb $0x0, %al
callq 0x1030
jmp 0x15fb
movl -0x3e4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3e4(%rbp)
jmp 0x1532
movl $0x0, -0x3e8(%rbp)
movl -0x3e8(%rbp), %eax
cmpl -0x3c4(%rbp), %eax
jge 0x167f
movslq -0x3e8(%rbp), %rax
movl -0x3c0(%rbp,%rax,4), %esi
leaq 0xa8e(%rip), %rdi       # 0x20ca
movb $0x0, %al
callq 0x1030
movl -0x3e8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3e8(%rbp)
movslq -0x3e8(%rbp), %rax
movl -0x3c0(%rbp,%rax,4), %esi
leaq 0xa69(%rip), %rdi       # 0x20d0
movb $0x0, %al
callq 0x1030
movl -0x3e8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3e8(%rbp)
jmp 0x1619
jmp 0x16d8
movq -0x228(%rbp), %rax
andq $0x1, %rax
cmpq $0x0, %rax
je 0x16d6
leaq -0x120(%rbp), %rdi
xorl %esi, %esi
movl $0xfa, %edx
callq 0x10a0
leaq -0x120(%rbp), %rdi
movq 0x292d(%rip), %rax      # 0x3fe0
movq (%rax), %rdx
movl $0xfa, %esi
callq 0x1130
movl -0x14(%rbp), %edi
leaq -0x120(%rbp), %rsi
movl $0xfa, %edx
xorl %ecx, %ecx
callq 0x1090
jmp 0x16d8
jmp 0x16da
cmpl $0x0, -0x230(%rbp)
je 0x140b
movl -0x14(%rbp), %edi
callq 0x1140
xorl %eax, %eax
addq $0x400, %rsp            # imm = 0x400
popq %rbp
retq