Il Forum di Orebla.it

Benvenuto nella community di Orebla.it
Oggi è dom 16 feb, 2020 8:12 pm

Tutti gli orari sono UTC + 1 ora




Apri un nuovo argomento Rispondi all’argomento  [ 1 messaggio ] 
Autore Messaggio
 Oggetto del messaggio: [C] SendMSG
Messaggio da leggereInviato: lun 13 ago, 2007 9:02 am 
Non connesso
super-guru
super-guru
Avatar utente

Iscritto il: mar 28 dic, 2004 6:54 pm
Messaggi: 300
Località: Pisa
Ecco a voi un programma in grado di far rivivere i gloriosi tempi del net send del DOS, ovvero un programmino che funziona con un modello client-server per l'invio di messaggi da un host all'altro, conoscendo l'IP.

Codice del server (che riceve il messaggio):
Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <time.h>

#if   SYSTEM == UNIX
   #include <sys/types.h>
   #include <sys/socket.h>
   #include <netinet/in.h>
#else
   #include <winsock.h>
   #define  close   closesocket
#endif

#define   MAXCONN   5
#define   PORT      3666

void addr_init(struct sockaddr_in *addr, int port, long ip) {
   addr->sin_family = AF_INET;
   addr->sin_port = htons((u_short)port);
   addr->sin_addr.s_addr = ip;
}

main(int argc, char **argv)  {
   char *msg;
   struct sockaddr_in  server_addr, client_addr;
   int client_len = sizeof(client_addr);
   int sd,new_sd;
   int i,j,N,size;
   time_t ltime = (unsigned) time(NULL);

   #ifdef WIN
      WSADATA wsaData;
      int iResult = WSAStartup (MAKEWORD(2,2), &wsaData);

      if (iResult != NO_ERROR)
      {
         printf ("Errore in WSAStartup()\n");
         exit(1);
      }
   #endif

   addr_init(&server_addr, PORT, INADDR_ANY);

   if ((sd=socket(AF_INET, SOCK_STREAM, 0))==-1)  {
      printf ("Errore nella creazione del socket\n");
      
      #ifdef WIN
         WSACleanup();
         system ("pause");
         exit(1);
      #endif
     
      exit(1);
   }
   
   if ( bind (sd, (struct sockaddr*) &server_addr, sizeof(server_addr))==-1 )  {
      printf ("Errore di bind\n");
      exit(2);
   }

   if (listen(sd,MAXCONN)==-1)  {
      printf ("Errore -- Impossibile accettare connessioni\n");
      exit(3);
   }

   for (;;)  {
      printf ("\nServer in attesa...\n");
      if ((new_sd=accept(sd, (struct sockaddr*) &client_addr, &client_len))==-1)  {
         printf ("Impossibile accettare connessioni da %s\n", inet_ntoa(client_addr.sin_addr));
         exit(4);
      }

      if (recv(new_sd, (int*) &N, sizeof(int), 0)<0)
         exit(5);

      ltime = (unsigned) time(NULL);

      printf ("%sMessaggio inviato da %s: ",
            ctime(&ltime), inet_ntoa(client_addr.sin_addr));

      for (i=0; i<N; i++)  {
         if (recv(new_sd, (int*) &size, sizeof(int), 0)<0)
            exit(5);
         
         msg = (char*) malloc(size*sizeof(char));

         if (recv(new_sd, (char*) msg, size, 0)<0)
            exit(5);

         for (j=0; j<size; j++)
            printf ("%c",msg[j]);
         printf (" ");
      }
   }

   close(new_sd);
   close(sd);
}


Codice del client (che invia il messaggio):

Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>

#if   SYSTEM == UNIX
   #include <sys/socket.h>
   #include <netinet/in.h>
#else
   #include <winsock.h>
   #define   close   closesocket
#endif

#define   PORT      3666

void addr_init(struct sockaddr_in *addr, int port, long ip) {
   addr->sin_family = AF_INET;
   addr->sin_port = htons((u_short)port);
   addr->sin_addr.s_addr = ip;
}

main(int argc, char **argv)  {
   int i,size,N;
   int sd;
   int var1,var2,var3,var4;
   struct sockaddr_in client_addr, server_addr;

   #ifdef WIN
      WSADATA wsaData;
      iResult=WSAStartup(MAKEWORD (2,2), &wsaData);

      if (iResult !=0){
         printf ("Errore WSA\n");
         return 0;
      }
   #endif

      if (argc<3)  {
         printf ("Usage: %s <server> <msg>\n", argv[0]);
         exit(1);
      }

      N=argc-2;

      if (sscanf(argv[1],"%d.%d.%d.%d", &var1,&var2,&var3,&var4) != 4)  {
         printf ("%s non è un indirizzo IPv4 valido\n", argv[1]);
         exit(2);
      }

      addr_init(&server_addr, PORT, inet_addr(argv[1]));

      if ((sd=socket(AF_INET, SOCK_STREAM, 0))==-1)
         exit(2);

      if (connect(sd, (struct sockaddr*) &server_addr, sizeof(struct sockaddr))==-1)
         exit(3);

      send (sd, (int*) &N, sizeof(int), 0);

      for (i=0; i<N; i++)  {
         size=strlen(argv[i+2]);

         send(sd, (int*) &size, sizeof(int), 0);
         send(sd, (char*) argv[i+2], size, 0);
      }

      close(sd);
}


Testato sia su Linux sia su Windows e compatibile con entrambi i sistemi operativi, grazie alle macro per il riconoscimento del sistema in uso. Buon divertimento.

_________________
Immagine
Immagine


Top
 Profilo  
 
Visualizza ultimi messaggi:  Ordina per  
Apri un nuovo argomento Rispondi all’argomento  [ 1 messaggio ] 

Tutti gli orari sono UTC + 1 ora


Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite


Non puoi aprire nuovi argomenti
Non puoi rispondere negli argomenti
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi inviare allegati

Cerca per:
Vai a:  
cron
Powered by phpBB® Forum Software © phpBB Group
Traduzione Italiana phpBBItalia.net basata su phpBB.it 2010
phpBB SEO