piffy

TCP client (C++/Win)

Aug 6th, 2015
314
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**Copyright (c) 2015 Mathias Buus, Marcello Missiroli & Remy Lebeau */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <winsock.h>
  5.  
  6. #define BUFFER_SIZE 1024
  7.  
  8. void on_error(const char *s, int *errCode = NULL)
  9. {
  10.     int err = (errCode) ? *errCode : WSAGetLastError();
  11.     fprintf(stderr, "%s: %d\n", s, err);
  12.     fflush(stderr);
  13.     WSACleanup();
  14.     scanf("%d",errCode);
  15.     exit(1);
  16. }
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20.     WSADATA wsadata;
  21.     int client_fd, porta=6666, n, err;
  22.     struct sockaddr_in serveraddr;
  23.     struct hostent *server;
  24.     char hostname[BUFFER_SIZE] = "localhost";
  25.     char buf[BUFFER_SIZE];
  26.    
  27.     /** Controllo linea di comando **/
  28.     if (argc > 3) on_error("Uso: tcp_client [hostname] [porta]\n");
  29.     if (argc > 2) porta = atoi(argv[2]);
  30.     if (argc > 1) strcpy(hostname, argv[1]);
  31.    
  32.     /** Inizializzazione Winsock **/
  33.     err = WSAStartup(MAKEWORD(2,2), &wsadata);
  34.     if (err != 0)
  35.         on_error("Errore in WSAStartup", &err);
  36.  
  37.         /* Crea il socket */
  38.     client_fd = socket(AF_INET, SOCK_STREAM, 0);
  39.     if (client_fd < 0)
  40.         on_error("Non riesco a creare il socket");
  41.  
  42.     /* Trasformare il nome host nel numero IP */
  43.     server = gethostbyname(hostname);
  44.     if (server == NULL) { on_error("Errore DNS"); }
  45.  
  46.     /* Costruire l'indirizzo Internet del server */
  47.     memset( &serveraddr, 0,sizeof(serveraddr));
  48.     serveraddr.sin_family = AF_INET; /** Famiglia internet **/
  49.     memcpy(
  50.       (char *)&serveraddr.sin_addr.s_addr,
  51.       (char *)server->h_addr,
  52.       server->h_length);
  53.     serveraddr.sin_port = htons(porta); /** Porta **/
  54.  
  55.     /* Crea una connessione con il server */
  56.     if (connect(client_fd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
  57.       on_error("Non riesco a connettermi");
  58.  
  59.     /* Leggi un messaggio dall'utente */
  60.     printf("Scrivi il messaggio: ");
  61.     memset(buf, 0, BUFFER_SIZE);
  62.     fgets(buf, BUFFER_SIZE, stdin);
  63.  
  64.     /* Invia il messaggio al server */
  65.     n = send(client_fd, buf, strlen(buf),0);
  66.     if (n < 0)
  67.       on_error("Non riesco al scrivere sul socket");
  68.  
  69.     /* Stampa la risposta del server */
  70.     memset(buf, 0, BUFFER_SIZE);
  71.     n = recv(client_fd, buf, BUFFER_SIZE,0);
  72.     if (n < 0)
  73.       on_error("Non riesco a leggere dal socket");
  74.     printf("Risposta del server: %s", buf);
  75.  
  76.     WSACleanup();
  77.     closesocket(client_fd);
  78.     return 0;
  79. }
RAW Paste Data