Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. /* Pannella Alessandro 0000773253 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netdb.h>
  10. #include <string.h>
  11.  
  12. #define LENGTH 128
  13.  
  14.  
  15. int main(int argc, char **argv)
  16. {
  17. struct hostent *host;
  18. struct sockaddr_in clientaddr, servaddr;
  19. int port, nread, sd, len = 0;
  20.  
  21.  
  22. char richiesta[LENGTH];
  23. int risposta;//Verificare formato risposta
  24.  
  25. /*CONTROLLO ARGOMENTI*/
  26. if (argc != 3){
  27. printf("Error:%s serverAddress serverPort\n"/*Come bisogna richiamare il programma*/, argv[0]);
  28. exit(1);
  29. }
  30. else{
  31. //Controllo porta (SE LA PORTA NON รˆ IL SECONDO ARGOMENTO MODIFICARE argv[])
  32. nread = 0;
  33. while (argv[2][nread] != '\0'){
  34. if ((argv[2][nread] < '0') || (argv[2][nread] > '9')){
  35. printf("Porta errata\n");
  36. printf("Error: %s serverAddress serverPort\n", argv[0]);
  37. exit(2);
  38. }
  39. nread++;
  40. }
  41. port = atoi(argv[2]);
  42. if (port < 1024 || port > 65535){
  43. printf("Error: %s port\n", argv[0]);
  44. printf("1024 <= port <= 65535\n");
  45. exit(2);
  46. }
  47. host = gethostbyname(argv[1]); //Indirizzo gia' in formato di rete, modificare argv[] se l'host non รจ il primo parametro
  48. if (host == NULL){
  49. printf("%s not found in /etc/hosts\n", argv[1]);
  50. exit(2);
  51. }
  52. }
  53. /*CONTROLLO ARGOMENTI*/
  54.  
  55. /*INIZIALIZZAZIONE INDIRIZZO CLIENT*/
  56. memset((char *) &clientaddr, 0, sizeof(struct sockaddr_in));
  57. clientaddr.sin_family = AF_INET;
  58. clientaddr.sin_addr.s_addr == INADDR_ANY;
  59. clientaddr.sin_port = 0;
  60. /*FINE INIZIALIZZAZIONE INDIRIZZO CLIENT*/
  61.  
  62. /*INIZIALIZZAZIONE INDIRIZZO SERVER*/
  63. memset((char *) &servaddr, 0, sizeof(struct sockaddr_in));
  64. servaddr.sin_family = AF_INET;
  65. servaddr.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
  66. servaddr.sin_port = htons(port);
  67. /*FINE INIZIALIZZAZIONE INDIRIZZO SERVER*/
  68.  
  69. /*CREAZIONE SOCKET*/
  70. sd = socket(AF_INET, SOCK_DGRAM, 0);
  71. if (sd < 0){
  72. perror("apertura socket");
  73. exit(1);
  74. }
  75. printf("Client: creata la socket sd=%d\n", sd);
  76. /*FINE CREAZIONE SOCKET*/
  77.  
  78. /*BIND SOCKET, A UNA PORTA A CASO*/
  79. if (bind(sd, (struct sockaddr *) &clientaddr, sizeof(clientaddr)) < 0){
  80. perror("bind socket ");
  81. close(sd);
  82. exit(1);
  83. }
  84. printf("Client: bind socket ok, alla porta %i\n", clientaddr.sin_port);
  85. /*BIND SOCKET, A UNA PORTA A CASO*/
  86.  
  87. /*PREPARAZIONE ED ESECUZIONE DEL CORPO PRINCIPALE*/
  88. printf("Dammi il comando, EOF per terminare: ");
  89.  
  90. while (gets(richiesta) != NULL){
  91. printf("Richiesta: %s\n", richiesta);
  92. risposta = 0;
  93.  
  94. //Se dobbiamo acquisire altri parametri per inviare la richiesta e se dobbiamo formattare questi parametri in un certo modo
  95.  
  96. //Richiesta operazione
  97. len = sizeof(servaddr);
  98. if (sendto(sd, &richiesta, strlen(nomeFile)+1, 0, (struct sockaddr *)&servaddr, len) < 0){
  99. perror("sendto");
  100. printf("Dammi il comando, EOF per terminare: ");
  101. continue;
  102. //Se questo invio fallisce il client torna all'inzio del ciclo
  103. }
  104.  
  105. //Ricezione del risultato
  106. printf("Attesa del risultato...\n");
  107.  
  108. // ATTENZIONE! L'ultimo parametro di recvfrom viene usato sia come parametro di input
  109. // che di output, len DEVE essere inizializzato alla lunghezza della struttura
  110. // sockaddr_in PRIMA di essere utilizzato
  111. if (recvfrom(sd, &risposta, sizeof(risposta), 0, (struct sockaddr *) &servaddr, &len) < 0){
  112. perror("recvfrom");
  113. printf("Dammi il comando, EOF per terminare: ");
  114. continue;
  115. //Se questo invio fallisce il client torna all'inzio del ciclo
  116. }
  117.  
  118. if (risposta < 0)
  119. printf("Operazione non riuscita\n");
  120. else
  121. printf("Esito dell'operazione %d\n", risposta);
  122.  
  123. printf("Dammi il comando, EOF per terminare: ");
  124. }//While gets
  125. /*FINE PREPARAZIONE ED ESECUZIONE DEL CORPO PRINCIPALE*/
  126.  
  127. close(sd);
  128. printf("\nClient: termino...\n");
  129. exit(0);
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement