/**Copyright (c) 2015 Mathias Buus, Marcello Missiroli & Remy Lebeau */ #include #include #include #define BUFFER_SIZE 1024 void on_error(const char *s, int *errCode = NULL) { int err = (errCode) ? *errCode : WSAGetLastError(); fprintf(stderr, "%s: %d\n", s, err); fflush(stderr); WSACleanup(); scanf("%d",errCode); exit(1); } int main(int argc, char *argv[]) { WSADATA wsadata; int client_fd, porta=6666, n, err; struct sockaddr_in serveraddr; struct hostent *server; char hostname[BUFFER_SIZE] = "localhost"; char buf[BUFFER_SIZE]; /** Controllo linea di comando **/ if (argc > 3) on_error("Uso: tcp_client [hostname] [porta]\n"); if (argc > 2) porta = atoi(argv[2]); if (argc > 1) strcpy(hostname, argv[1]); /** Inizializzazione Winsock **/ err = WSAStartup(MAKEWORD(2,2), &wsadata); if (err != 0) on_error("Errore in WSAStartup", &err); /* Crea il socket */ client_fd = socket(AF_INET, SOCK_STREAM, 0); if (client_fd < 0) on_error("Non riesco a creare il socket"); /* Trasformare il nome host nel numero IP */ server = gethostbyname(hostname); if (server == NULL) { on_error("Errore DNS"); } /* Costruire l'indirizzo Internet del server */ memset( &serveraddr, 0,sizeof(serveraddr)); serveraddr.sin_family = AF_INET; /** Famiglia internet **/ memcpy( (char *)&serveraddr.sin_addr.s_addr, (char *)server->h_addr, server->h_length); serveraddr.sin_port = htons(porta); /** Porta **/ /* Crea una connessione con il server */ if (connect(client_fd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) on_error("Non riesco a connettermi"); /* Leggi un messaggio dall'utente */ printf("Scrivi il messaggio: "); memset(buf, 0, BUFFER_SIZE); fgets(buf, BUFFER_SIZE, stdin); /* Invia il messaggio al server */ n = send(client_fd, buf, strlen(buf),0); if (n < 0) on_error("Non riesco al scrivere sul socket"); /* Stampa la risposta del server */ memset(buf, 0, BUFFER_SIZE); n = recv(client_fd, buf, BUFFER_SIZE,0); if (n < 0) on_error("Non riesco a leggere dal socket"); printf("Risposta del server: %s", buf); WSACleanup(); closesocket(client_fd); return 0; }