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