Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Pannella Alessandro 0000773253 */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <string.h>
- #define LENGTH 128
- int main(int argc, char **argv)
- {
- struct hostent *host;
- struct sockaddr_in clientaddr, servaddr;
- int port, nread, sd, len = 0;
- char richiesta[LENGTH];
- int risposta;//Verificare formato risposta
- /*CONTROLLO ARGOMENTI*/
- if (argc != 3){
- printf("Error:%s serverAddress serverPort\n"/*Come bisogna richiamare il programma*/, argv[0]);
- exit(1);
- }
- else{
- //Controllo porta (SE LA PORTA NON ร IL SECONDO ARGOMENTO MODIFICARE argv[])
- nread = 0;
- while (argv[2][nread] != '\0'){
- if ((argv[2][nread] < '0') || (argv[2][nread] > '9')){
- printf("Porta errata\n");
- printf("Error: %s serverAddress serverPort\n", argv[0]);
- exit(2);
- }
- nread++;
- }
- port = atoi(argv[2]);
- if (port < 1024 || port > 65535){
- printf("Error: %s port\n", argv[0]);
- printf("1024 <= port <= 65535\n");
- exit(2);
- }
- host = gethostbyname(argv[1]); //Indirizzo gia' in formato di rete, modificare argv[] se l'host non รจ il primo parametro
- if (host == NULL){
- printf("%s not found in /etc/hosts\n", argv[1]);
- exit(2);
- }
- }
- /*CONTROLLO ARGOMENTI*/
- /*INIZIALIZZAZIONE INDIRIZZO CLIENT*/
- memset((char *) &clientaddr, 0, sizeof(struct sockaddr_in));
- clientaddr.sin_family = AF_INET;
- clientaddr.sin_addr.s_addr == INADDR_ANY;
- clientaddr.sin_port = 0;
- /*FINE INIZIALIZZAZIONE INDIRIZZO CLIENT*/
- /*INIZIALIZZAZIONE INDIRIZZO SERVER*/
- memset((char *) &servaddr, 0, sizeof(struct sockaddr_in));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
- servaddr.sin_port = htons(port);
- /*FINE INIZIALIZZAZIONE INDIRIZZO SERVER*/
- /*CREAZIONE SOCKET*/
- sd = socket(AF_INET, SOCK_DGRAM, 0);
- if (sd < 0){
- perror("apertura socket");
- exit(1);
- }
- printf("Client: creata la socket sd=%d\n", sd);
- /*FINE CREAZIONE SOCKET*/
- /*BIND SOCKET, A UNA PORTA A CASO*/
- if (bind(sd, (struct sockaddr *) &clientaddr, sizeof(clientaddr)) < 0){
- perror("bind socket ");
- close(sd);
- exit(1);
- }
- printf("Client: bind socket ok, alla porta %i\n", clientaddr.sin_port);
- /*BIND SOCKET, A UNA PORTA A CASO*/
- /*PREPARAZIONE ED ESECUZIONE DEL CORPO PRINCIPALE*/
- printf("Dammi il comando, EOF per terminare: ");
- while (gets(richiesta) != NULL){
- printf("Richiesta: %s\n", richiesta);
- risposta = 0;
- //Se dobbiamo acquisire altri parametri per inviare la richiesta e se dobbiamo formattare questi parametri in un certo modo
- //Richiesta operazione
- len = sizeof(servaddr);
- if (sendto(sd, &richiesta, strlen(nomeFile)+1, 0, (struct sockaddr *)&servaddr, len) < 0){
- perror("sendto");
- printf("Dammi il comando, EOF per terminare: ");
- continue;
- //Se questo invio fallisce il client torna all'inzio del ciclo
- }
- //Ricezione del risultato
- printf("Attesa del risultato...\n");
- // ATTENZIONE! L'ultimo parametro di recvfrom viene usato sia come parametro di input
- // che di output, len DEVE essere inizializzato alla lunghezza della struttura
- // sockaddr_in PRIMA di essere utilizzato
- if (recvfrom(sd, &risposta, sizeof(risposta), 0, (struct sockaddr *) &servaddr, &len) < 0){
- perror("recvfrom");
- printf("Dammi il comando, EOF per terminare: ");
- continue;
- //Se questo invio fallisce il client torna all'inzio del ciclo
- }
- if (risposta < 0)
- printf("Operazione non riuscita\n");
- else
- printf("Esito dell'operazione %d\n", risposta);
- printf("Dammi il comando, EOF per terminare: ");
- }//While gets
- /*FINE PREPARAZIONE ED ESECUZIONE DEL CORPO PRINCIPALE*/
- close(sd);
- printf("\nClient: termino...\n");
- exit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement