Raccolta di howto, informazioni, consigli, trucchi e documentazione di varia utilità per ricordare tante cose utili

mercoledì 9 dicembre 2009

Invio di pacchetti UDP in C (unix)

Di seguito la procedura per inviare un pacchetto UDP attraverso un socket in un sorgente C per linux/unix.
Iniziamo definendo gli opportuni include generici:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
gli include specifici per il funzionamento dei socket
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
e le definizione dell'indirizzo ip e della porta di destinazione
#define IPADDR "192.168.1.100"
#define PORT (5000)
Successivamente creiamo il socket UDP
int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s == -1) {
  perror("Creazione socket fallita");
  exit(1);
}
definiamo e valorizziamo la struttura contenente la destinazione del pacchetto
struct sockaddr_in addr;
memset((char *)&addr, sizeof(addr), 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_aton(IPADDR, &addr.sin_addr);
Creiamo e valorizziamo il buffer con i dati da inviare
int buf[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
ed infine inviamo il pacchetto sulla rete alla destinazione voluta
int len=sendto(s, buf, 10*sizeof(int), 0, (struct sockaddr *)&addr, sizeof(addr));
if(len < (10*sizeof(int))) perror("Invio fallito o incompleto");
Per concludere chiudiamo il socket
close(s);
Di seguito il sorgente completo

#include <stdlib.h>
#include <stdio.h>;
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define IPADDR "192.168.1.100"
#define PORT (5000)

int main() {

  int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (s == -1) {
    perror("Creazione socket fallita");
    exit(1);

  }

  struct sockaddr_in addr;
  memset((char *)&addr, sizeof(addr), 0);

  addr.sin_family = AF_INET;
  addr.sin_port = htons(PORT);
  inet_aton(IPADDR, &addr.sin_addr);


  int buf[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  int len=sendto(s, buf, 10*sizeof(int), 0, (struct sockaddr *)&addr, sizeof(addr));
  if(len < (10*sizeof(int))) perror("Invio fallito o incompleto");

  close(s);

  return 0;
}

Nessun commento: