		#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #define PORT 58011
     
    char command[80];
    int firstCmd = 0;
     
    void readCommand(){
        //printf("Insert command: ");
        fgets(command, sizeof(command), stdin);
    }
    void removeChar(char *str, char garbage) {
     
        char *src, *dst;
        for (src = dst = str; *src != '\0'; src++) {
            *dst = *src;
            if (*dst != garbage) dst++;
        }
        *dst = '\0';
    }
     
    int main ( int argc, char *argv[] ) {  //argc fica com o nº de argumentos (./1 2 3 4 5 ...)  argv guarda palavra a palavra
        int fdd, fds;           //2 sockets um datagram e outro stream      
        struct hostent *hostptr;
        struct sockaddr_in serveraddr, clientaddr;
        struct hostent *h;
        int addrlen;
        char buffer[1024];
        char cmdaux[80], *numInput;
        numInput = (char*)malloc(sizeof(char)*40);
        char *msg = "RQT\n";
        fdd = socket(AF_INET, SOCK_DGRAM, 0); //socket datagram
        fds = socket(AF_INET, SOCK_STREAM, 0);//socket stream  
        char f[128], ip[128];
        unsigned int port = PORT;
        char *PCname, *servername, *RQCstr;
        int numArgs = 0;
        int buffersize=1024;
        int bytesocupados =0;
        
     
       
        if(argc>1){   //se tiver argumentos (./user conta como o 1º argumento para o argc)
            while(numArgs<argc){
                if(strcmp(argv[numArgs],"-p")==0) //se tiver o argumento -p entao o argumento seguinte fica guardado como int no port
                    port=strtol(argv[numArgs+1],NULL,10);
                if(strcmp(argv[numArgs],"-n")==0) //se tiver o argumento -n entao o argumento seguinte fica guardado em PCname
                    PCname=argv[numArgs+1];
                numArgs++;
            }
        }
     
        servername=strcat(PCname,".ist.utl.pt"); //como o argumento é o nome do computador é preciso concatenar para se tornar num endereço
        printf("%s %d\n",servername,port);
        hostptr=gethostbyname(servername);
        memset((void*)&serveraddr,(int)'\0',sizeof(serveraddr));
        serveraddr.sin_family=AF_INET;
        serveraddr.sin_addr.s_addr=((struct in_addr *)(hostptr->h_addr_list[0]))->s_addr;
        serveraddr.sin_port=htons((u_short)port);
        addrlen=sizeof(serveraddr);
     
        //manda RQT (msg ja tem RQT) ao servidor LS para que ele devolva uma lista de conteudos a pedir
        sendto(fdd,msg,strlen(msg),0,(struct sockaddr*)&serveraddr,addrlen);
        int size = recvfrom(fdd,buffer,sizeof(buffer),0,(struct sockaddr*)&serveraddr,&addrlen); //vai receber uma lista de tamanho size, e fica em buffer
        h=gethostbyaddr((char*)&serveraddr.sin_addr,sizeof(struct in_addr),AF_INET);
       
       
     
        char *buffertemp = (char*)malloc(1024*sizeof(char));
        memset(buffertemp, '\0', sizeof(buffertemp));
        buffer[size] = '\0'; //n me lembro...perguntar ao tomás ...era adicionar o eof ao final ??
       
        strcpy(buffertemp,buffer); //copia do buffer pois strtok é destructivo
        int tokencycle=0;
        char* token1=strtok(buffertemp," ");
           
    //imprime a lista toda excluindo a 1ª palavra (AWT) e a terceira (tamanho), colocando ":" aseguir a 2ª palavra (tema), e o resto da seguinte maneira "num - contnt"
         while(token1!=NULL){
                if(tokencycle==1)
                    printf("%s:\n",token1);
                else if(tokencycle!=0 && tokencycle!=2)
                    printf("%d - %s\n",tokencycle-2,token1);
                tokencycle++;
                token1=strtok(NULL," ");
            }
     
        if(h==NULL)
            printf("sent by [%s:%hu]\n",inet_ntoa(serveraddr.sin_addr),ntohs(serveraddr.sin_port));
        else printf("sent by [%s:%hu]\n",h->h_name,ntohs(serveraddr.sin_port));
                 
     
     
       
     
    //2 / apos receber a lista é necessario fazer umrequest do conteudo
     
        msg=(char*)calloc(40,sizeof(char));
        RQCstr = (char*)malloc(sizeof(char)*20);
        strcpy(RQCstr,"RQC ");
        scanf("%s",numInput); //pedido do conteudo
        strcat(RQCstr,numInput); //adicionar RQC ao pedido
        strcat(RQCstr,"\n");
     
        sendto(fdd,RQCstr,strlen(RQCstr),0,(struct sockaddr*)&serveraddr,addrlen); //enviar o pedido ao servidor
		free(RQCstr);
        size = recvfrom(fdd,buffer,sizeof(buffer),0,(struct sockaddr*)&serveraddr,&addrlen); //recebe AWC content serverSSQueTemContent PortDoServerSS
        buffer[size] = '\0'; //n me lembro...perguntar ao tomás ...era adicionar o eof ao final ??
        h=gethostbyaddr((char*)&serveraddr.sin_addr,sizeof(struct in_addr),AF_INET);
         
        tokencycle=0;
        struct hostent* h2;
       
        char* SSname, *SSmsg;       //guardar a info para depois ligar ao novo servidor (SS)
        char* token=strtok(buffer," ");
            while(token!=NULL){
            if(tokencycle>0){
                if(tokencycle==3){      //se for o 4º token (3º ciclo) entao é o port, que vai ser guardado como int em port e imprimido
                port=strtol(token,NULL,10);
                printf("porta mudada para: %d\n",port);
                }
                else{
                if(tokencycle==2){      //se for o 3º token (2º ciclo) entao é o IP, que vai ser guardado e imprimido
                    SSname=token;
            printf("servernewname: %s\n ",token);
            }
                if(tokencycle==1){      //se for o 2º token (1º ciclo) entao é o conteudo pedido, que vai ser guardado e imprimido
                    SSmsg=token;    
             printf("SSmsg:%s\n ",token);
            }
                }
            }
                token=strtok(NULL," ");
                tokencycle++;
            }
        if(h==NULL)
            printf("sent by [%s:%hu]\n",inet_ntoa(serveraddr.sin_addr),ntohs(serveraddr.sin_port));
        else printf("sent by [%s:%hu]\n",h->h_name,ntohs(serveraddr.sin_port));
     
        close(fdd);
     
        //////////////////////////////////////////////////////////////////////////////////////
     
            hostptr=gethostbyname(SSname);
            memset((void*)&serveraddr,(int)'\0',sizeof(serveraddr));
            serveraddr.sin_family=AF_INET;
            serveraddr.sin_addr.s_addr=((struct in_addr *)(hostptr->h_addr_list[0]))->s_addr;
            serveraddr.sin_port=htons((u_short)port);
            addrlen=sizeof(serveraddr);
            if(connect(fds,(struct sockaddr*)&serveraddr, sizeof(serveraddr))<0)
                printf("Nao se conectou");
                      
              ////////////////////////////////////////////////////////////////////  
             //////////////// 28/09 - tiago refiz o codigo //////////////////////
            ////////////////////////////////////////////////////////////////////          
		int xSize = strlen("REQ ")+1;
        char* msgm = (char*)malloc(xSize);
        strcpy(msgm,"REQ ");
		msgm = (char*)realloc(msgm,xSize+strlen(SSmsg));
        strcat(msgm,SSmsg); //adicionar REQ ao pedido
		xSize += strlen(SSmsg);
		msgm = (char*)realloc(msgm,xSize+strlen("\n"));
		xSize += strlen("\n");
        strcat(msgm,"\n");
        printf("%s %s","(debug)",msgm);
 		char* msgmcpy = msgm;
            char *token4, *imageptr;  // *'s ou nao ?
            int nbytes = 256, nwritten, nread, nleft = strlen(msgm), bufferready=0;
           long datasize;
              while(nleft>0){
                nwritten = write(fds,msgm,nleft);
                //if(nwritten<=0)exit(1);
                nleft -= nwritten;
                msgmcpy+=nwritten;
            }
			free(msgm);
			//free(msgmcpy);
                        int numiter = 0;
                        memset(buffer,'\0',sizeof(buffer));
           int it2 = 0;
			//int bytesocupados2 = 0;
			int ibSize = 0;
			int contZ = 0;
			//char* imagebuffer;
		if((nread = read(fds, buffer, buffersize))>0){
			printf("NfirstBytes: %d\n", nread);
			char * imagebufferz = (char*)malloc(nread);
			//char ** goodfornothing;
			ibSize+=nread;
			memcpy(imagebufferz, buffer, nread);
			memset(buffer,'\0',sizeof(buffer));
			if( (token4 = strtok(imagebufferz," ")) == NULL){
                        printf("ERROR: received message not valid \n");
                        //exit(1);
                    }
                    printf("%s %s\n","(debug1.5)",token4);
     
                    if( strcmp(token4, "REP") !=0){
                        printf("ERROR: no 'REP' message\n");
                        //exit(1);
                    }  
     
                    if( (token4 = strtok(NULL," ")) == NULL){
                        printf("ERROR: received message not valid \n");
                        //exit(1);
                    }  
		    
                    printf("%s %s\n","(debug2)",token4);
                    if( strcmp(token4, "ok") !=0){
                        printf("ERROR: no 'ok' message\n");
                        //exit(1);
                    }
                    if( (token4 = strtok(NULL," ")) == NULL){
                        printf("ERROR: received message not valid \n");
                        //exit(1);
                    }  
                    printf("%s %s\n","(debug3)",token4);
                    if( (datasize = strtol(token4, NULL, 10)) <= 0){
                        printf("ERROR: size received in message is not a valid number \n");
                        //exit(1);
                    }
		    token4= strtok(NULL," ");
		    printf("Resto: %s\n",token4);
					//free(imagebufferz);
                    printf("%s %ld\n","(debug4)",datasize);
					char* databuffer = (char*)malloc(datasize);
                     
                			char* dbaux = databuffer;
				 	while((nread = read(fds, dbaux, datasize))>0){
						dbaux += nread;	
								printf("transfering...");
					}
					close(fds);  //fecha socket 	       
				    FILE *image;
				    image = fopen("fileOP.jpg","wb");
				    fwrite(databuffer, 1, datasize, image);    // grava a imagem
				    fclose(image);
					//free(databuffer);
				}   
    }