#include #include #include #include #include #include #include #include #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(numArgsh_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); } }