C code :/


SUBMITTED BY: Guest

DATE: Sept. 29, 2013, 11:03 p.m.

FORMAT: Text only

SIZE: 11.2 kB

HITS: 1042

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <netdb.h>
  9. #define PORT 58011
  10. char command[80];
  11. int firstCmd = 0;
  12. void readCommand(){
  13. //printf("Insert command: ");
  14. fgets(command, sizeof(command), stdin);
  15. }
  16. void removeChar(char *str, char garbage) {
  17. char *src, *dst;
  18. for (src = dst = str; *src != '\0'; src++) {
  19. *dst = *src;
  20. if (*dst != garbage) dst++;
  21. }
  22. *dst = '\0';
  23. }
  24. int main ( int argc, char *argv[] ) { //argc fica com o nº de argumentos (./1 2 3 4 5 ...) argv guarda palavra a palavra
  25. int fdd, fds; //2 sockets um datagram e outro stream
  26. struct hostent *hostptr;
  27. struct sockaddr_in serveraddr, clientaddr;
  28. struct hostent *h;
  29. int addrlen;
  30. char buffer[1024];
  31. char cmdaux[80], *numInput;
  32. numInput = (char*)malloc(sizeof(char)*40);
  33. char *msg = "RQT\n";
  34. fdd = socket(AF_INET, SOCK_DGRAM, 0); //socket datagram
  35. fds = socket(AF_INET, SOCK_STREAM, 0);//socket stream
  36. char f[128], ip[128];
  37. unsigned int port = PORT;
  38. char *PCname, *servername, *RQCstr;
  39. int numArgs = 0;
  40. int buffersize=1024;
  41. int bytesocupados =0;
  42. if(argc>1){ //se tiver argumentos (./user conta como o 1º argumento para o argc)
  43. while(numArgs<argc){
  44. if(strcmp(argv[numArgs],"-p")==0) //se tiver o argumento -p entao o argumento seguinte fica guardado como int no port
  45. port=strtol(argv[numArgs+1],NULL,10);
  46. if(strcmp(argv[numArgs],"-n")==0) //se tiver o argumento -n entao o argumento seguinte fica guardado em PCname
  47. PCname=argv[numArgs+1];
  48. numArgs++;
  49. }
  50. }
  51. servername=strcat(PCname,".ist.utl.pt"); //como o argumento é o nome do computador é preciso concatenar para se tornar num endereço
  52. printf("%s %d\n",servername,port);
  53. hostptr=gethostbyname(servername);
  54. memset((void*)&serveraddr,(int)'\0',sizeof(serveraddr));
  55. serveraddr.sin_family=AF_INET;
  56. serveraddr.sin_addr.s_addr=((struct in_addr *)(hostptr->h_addr_list[0]))->s_addr;
  57. serveraddr.sin_port=htons((u_short)port);
  58. addrlen=sizeof(serveraddr);
  59. //manda RQT (msg ja tem RQT) ao servidor LS para que ele devolva uma lista de conteudos a pedir
  60. sendto(fdd,msg,strlen(msg),0,(struct sockaddr*)&serveraddr,addrlen);
  61. int size = recvfrom(fdd,buffer,sizeof(buffer),0,(struct sockaddr*)&serveraddr,&addrlen); //vai receber uma lista de tamanho size, e fica em buffer
  62. h=gethostbyaddr((char*)&serveraddr.sin_addr,sizeof(struct in_addr),AF_INET);
  63. char *buffertemp = (char*)malloc(1024*sizeof(char));
  64. memset(buffertemp, '\0', sizeof(buffertemp));
  65. buffer[size] = '\0'; //n me lembro...perguntar ao tomás ...era adicionar o eof ao final ??
  66. strcpy(buffertemp,buffer); //copia do buffer pois strtok é destructivo
  67. int tokencycle=0;
  68. char* token1=strtok(buffertemp," ");
  69. //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"
  70. while(token1!=NULL){
  71. if(tokencycle==1)
  72. printf("%s:\n",token1);
  73. else if(tokencycle!=0 && tokencycle!=2)
  74. printf("%d - %s\n",tokencycle-2,token1);
  75. tokencycle++;
  76. token1=strtok(NULL," ");
  77. }
  78. if(h==NULL)
  79. printf("sent by [%s:%hu]\n",inet_ntoa(serveraddr.sin_addr),ntohs(serveraddr.sin_port));
  80. else printf("sent by [%s:%hu]\n",h->h_name,ntohs(serveraddr.sin_port));
  81. //2 / apos receber a lista é necessario fazer umrequest do conteudo
  82. msg=(char*)calloc(40,sizeof(char));
  83. RQCstr = (char*)malloc(sizeof(char)*20);
  84. strcpy(RQCstr,"RQC ");
  85. scanf("%s",numInput); //pedido do conteudo
  86. strcat(RQCstr,numInput); //adicionar RQC ao pedido
  87. strcat(RQCstr,"\n");
  88. sendto(fdd,RQCstr,strlen(RQCstr),0,(struct sockaddr*)&serveraddr,addrlen); //enviar o pedido ao servidor
  89. free(RQCstr);
  90. size = recvfrom(fdd,buffer,sizeof(buffer),0,(struct sockaddr*)&serveraddr,&addrlen); //recebe AWC content serverSSQueTemContent PortDoServerSS
  91. buffer[size] = '\0'; //n me lembro...perguntar ao tomás ...era adicionar o eof ao final ??
  92. h=gethostbyaddr((char*)&serveraddr.sin_addr,sizeof(struct in_addr),AF_INET);
  93. tokencycle=0;
  94. struct hostent* h2;
  95. char* SSname, *SSmsg; //guardar a info para depois ligar ao novo servidor (SS)
  96. char* token=strtok(buffer," ");
  97. while(token!=NULL){
  98. if(tokencycle>0){
  99. if(tokencycle==3){ //se for o 4º token (3º ciclo) entao é o port, que vai ser guardado como int em port e imprimido
  100. port=strtol(token,NULL,10);
  101. printf("porta mudada para: %d\n",port);
  102. }
  103. else{
  104. if(tokencycle==2){ //se for o 3º token (2º ciclo) entao é o IP, que vai ser guardado e imprimido
  105. SSname=token;
  106. printf("servernewname: %s\n ",token);
  107. }
  108. if(tokencycle==1){ //se for o 2º token (1º ciclo) entao é o conteudo pedido, que vai ser guardado e imprimido
  109. SSmsg=token;
  110. printf("SSmsg:%s\n ",token);
  111. }
  112. }
  113. }
  114. token=strtok(NULL," ");
  115. tokencycle++;
  116. }
  117. if(h==NULL)
  118. printf("sent by [%s:%hu]\n",inet_ntoa(serveraddr.sin_addr),ntohs(serveraddr.sin_port));
  119. else printf("sent by [%s:%hu]\n",h->h_name,ntohs(serveraddr.sin_port));
  120. close(fdd);
  121. //////////////////////////////////////////////////////////////////////////////////////
  122. hostptr=gethostbyname(SSname);
  123. memset((void*)&serveraddr,(int)'\0',sizeof(serveraddr));
  124. serveraddr.sin_family=AF_INET;
  125. serveraddr.sin_addr.s_addr=((struct in_addr *)(hostptr->h_addr_list[0]))->s_addr;
  126. serveraddr.sin_port=htons((u_short)port);
  127. addrlen=sizeof(serveraddr);
  128. if(connect(fds,(struct sockaddr*)&serveraddr, sizeof(serveraddr))<0)
  129. printf("Nao se conectou");
  130. ////////////////////////////////////////////////////////////////////
  131. //////////////// 28/09 - tiago refiz o codigo //////////////////////
  132. ////////////////////////////////////////////////////////////////////
  133. int xSize = strlen("REQ ")+1;
  134. char* msgm = (char*)malloc(xSize);
  135. strcpy(msgm,"REQ ");
  136. msgm = (char*)realloc(msgm,xSize+strlen(SSmsg));
  137. strcat(msgm,SSmsg); //adicionar REQ ao pedido
  138. xSize += strlen(SSmsg);
  139. msgm = (char*)realloc(msgm,xSize+strlen("\n"));
  140. xSize += strlen("\n");
  141. strcat(msgm,"\n");
  142. printf("%s %s","(debug)",msgm);
  143. char* msgmcpy = msgm;
  144. char *token4, *imageptr; // *'s ou nao ?
  145. int nbytes = 256, nwritten, nread, nleft = strlen(msgm), bufferready=0;
  146. long datasize;
  147. while(nleft>0){
  148. nwritten = write(fds,msgm,nleft);
  149. //if(nwritten<=0)exit(1);
  150. nleft -= nwritten;
  151. msgmcpy+=nwritten;
  152. }
  153. free(msgm);
  154. //free(msgmcpy);
  155. int numiter = 0;
  156. memset(buffer,'\0',sizeof(buffer));
  157. int it2 = 0;
  158. //int bytesocupados2 = 0;
  159. int ibSize = 0;
  160. int contZ = 0;
  161. //char* imagebuffer;
  162. if((nread = read(fds, buffer, buffersize))>0){
  163. printf("NfirstBytes: %d\n", nread);
  164. char * imagebufferz = (char*)malloc(nread);
  165. //char ** goodfornothing;
  166. ibSize+=nread;
  167. memcpy(imagebufferz, buffer, nread);
  168. memset(buffer,'\0',sizeof(buffer));
  169. if( (token4 = strtok(imagebufferz," ")) == NULL){
  170. printf("ERROR: received message not valid \n");
  171. //exit(1);
  172. }
  173. printf("%s %s\n","(debug1.5)",token4);
  174. if( strcmp(token4, "REP") !=0){
  175. printf("ERROR: no 'REP' message\n");
  176. //exit(1);
  177. }
  178. if( (token4 = strtok(NULL," ")) == NULL){
  179. printf("ERROR: received message not valid \n");
  180. //exit(1);
  181. }
  182. printf("%s %s\n","(debug2)",token4);
  183. if( strcmp(token4, "ok") !=0){
  184. printf("ERROR: no 'ok' message\n");
  185. //exit(1);
  186. }
  187. if( (token4 = strtok(NULL," ")) == NULL){
  188. printf("ERROR: received message not valid \n");
  189. //exit(1);
  190. }
  191. printf("%s %s\n","(debug3)",token4);
  192. if( (datasize = strtol(token4, NULL, 10)) <= 0){
  193. printf("ERROR: size received in message is not a valid number \n");
  194. //exit(1);
  195. }
  196. token4= strtok(NULL," ");
  197. printf("Resto: %s\n",token4);
  198. //free(imagebufferz);
  199. printf("%s %ld\n","(debug4)",datasize);
  200. char* databuffer = (char*)malloc(datasize);
  201. char* dbaux = databuffer;
  202. while((nread = read(fds, dbaux, datasize))>0){
  203. dbaux += nread;
  204. printf("transfering...");
  205. }
  206. close(fds); //fecha socket
  207. FILE *image;
  208. image = fopen("fileOP.jpg","wb");
  209. fwrite(databuffer, 1, datasize, image); // grava a imagem
  210. fclose(image);
  211. //free(databuffer);
  212. }
  213. }

comments powered by Disqus