Chiedo scusa per le mie scarsi informazioni!!
Il mio ambiente di programmazione è linux, nello specifico, linux knoppix.
Sto lavorando su il protocollo PTP (IEEE 1588), che è un protocollo di sincronizzazione (scritto in C), in fine, la modifica che ho apportato a questo protocollo, è nel file net.c , che è relativo alla trasmissione e ricezione dei vari messaggi..
Le librerie incluse sono:
codice:
/* net.c */

#include "../ptpd.h"
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sched.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <asm/io.h>

#include <rtai_lxrt.h>
#include <rtnet.h>
la parte relativa alle mie modifiche è riguardante la funzione netRecvEvent:

codice:
ssize_t netRecvEvent(Octet *buf, TimeInternal *time, NetPath *netPath)
{
  ssize_t ret; 
  struct msghdr msg;
  struct iovec vec[1];
  struct sockaddr_in from_addr;  //struttura che specifica the client's address
  union {
      struct cmsghdr cm;  //struttura che viene utilizzata per ridurre al minimo il numero di parametri
      char control[CMSG_SPACE(sizeof(struct timeval))];
  } cmsg_un;
  struct cmsghdr *cmsg;
  struct timeval *tv;
  
  RT_TASK *lxrtnettsk;                      //
      
  vec[0].iov_base = buf;
  vec[0].iov_len = PACKET_SIZE;
  
  memset(&msg, 0, sizeof(msg));
  memset(&from_addr, 0, sizeof(from_addr));
  memset(buf, 0, PACKET_SIZE);
  memset(&cmsg_un, 0, sizeof(cmsg_un));
  
  msg.msg_name = (caddr_t)&from_addr;
  msg.msg_namelen = sizeof(from_addr);
  msg.msg_iov = vec;
  msg.msg_iovlen = 1;
  msg.msg_control = cmsg_un.control;
  msg.msg_controllen = sizeof(cmsg_un.control);
  msg.msg_flags = 0;
  
      /* Initialize a real time buddy. */
    lxrtnettsk = rt_task_init(4900, 1, 0, 0);
    if (NULL == lxrtnettsk) {
        rt_dev_close(netPath->eventSock);
        printf("CANNOT INIT MASTER TASK\n");
        exit(1);
    }

   	 /* Switch over to hard realtime mode. */
    	rt_make_hard_real_time();

//	ret = rt_dev_recv(netPath->eventSock, msg, sizeof(msg), 0);
//	ret = rt_dev_recv(netPath->eventSock, msg.msg_name, sizeof(&msg), 0);
	ret = rt_dev_recv(netPath->eventSock, msg.msg_name, sizeof(&msg), 0);


  	/* Switch over to soft realtime mode. */
	rt_make_soft_real_time();          // aggiunto !!

   	/* Delete realtime buddy. */
   	rt_task_delete(lxrtnettsk);     //aggiunto !!

//  ret = recvmsg(netPath->eventSock, &msg, MSG_DONTWAIT);  // funzione che deve ricevere un messaggio da una modalità di connessione tipicamente da un socket
  if(ret <= 0)
  {
    if(errno == EAGAIN || errno == EINTR)   // files libreria standard d C che contiene definizioni di macro per la gestione delle situazioni di errori
      return 0;
    
    return ret;
  }
  
  if(msg.msg_flags&MSG_TRUNC)
  {
    ERROR("received truncated message\n");
    return 0;
  }
  
  /* get time stamp of packet */
  if(!time)
  {
    ERROR("null receive time stamp argument\n");
    return 0;
  }
  
  if(msg.msg_flags&MSG_CTRUNC)
  {
    ERROR("received truncated ancillary data\n");
    return 0;
  }
  
  if(msg.msg_controllen < sizeof(cmsg_un.control))
  {
    ERROR("received short ancillary data (%d/%d)\n",
      msg.msg_controllen, (int)sizeof(cmsg_un.control));
    
    return 0;
  }
  
  tv = 0;
  for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg))
  {
    if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_TIMESTAMP)
      tv = (struct timeval *)CMSG_DATA(cmsg);
  }
  
  if(tv)
  {
    time->seconds = tv->tv_sec;
    time->nanoseconds = tv->tv_usec*1000;
    DBGV("kernel recv time stamp %us %dns\n", time->seconds, time->nanoseconds);
  }
  else
  {
    /* do not try to get by with recording the time here, better to fail
       because the time recorded could be well after the message receive,
       which would put a big spike in the offset signal sent to the clock servo */
       
    DBG("no recieve time stamp\n");
    return 0;
  }

  return ret;
}

ssize_t netRecvGeneral(Octet *buf, NetPath *netPath)
{

  RT_TASK *lxrtnettsk;                      //

  ssize_t ret;  //ssize_t , è un tipo di dato per rappresentare le dimenzione dei blocchi, che possono essere letti o scritti in una sola operazione
  //struct sockaddr_in addr; // struttura per impostare gli indirizzi
  //socklen_t addr_len = sizeof(struct sockaddr_in); // socklen_t--> richiamo di una applicazione UDP
				//socket = punto di contatto tra un processo e una risorsa gestita
  //receive from, è una funzione di input/output di un socket

      /* Initialize a real time buddy. */
    lxrtnettsk = rt_task_init(4900, 1, 0, 0);
    if (NULL == lxrtnettsk) {
        rt_dev_close(netPath->eventSock);
        printf("CANNOT INIT MASTER TASK\n");
        exit(1);
    }

    /* Switch over to hard realtime mode. */
    rt_make_hard_real_time();


  	ret = rt_dev_recv(netPath->generalSock, buf, sizeof(buf), 0);        //

  	/* Switch over to soft realtime mode. */
   	 rt_make_soft_real_time();          // aggiunto !!

   	/* Delete realtime buddy. */
   	rt_task_delete(lxrtnettsk);     //aggiunto !!


//  ret = recvfrom(netPath->generalSock, buf, PACKET_SIZE, MSG_DONTWAIT, (struct sockaddr *)&addr, &addr_len);
  if(ret <= 0)
  {
    if(errno == EAGAIN || errno == EINTR)  //erro rappresenta la libreria standard del C che contiene definizioni di macro per la gestione delle situazioni di errore.
      return 0;
    
    return ret;
  }  
 
  return ret;
}

ssize_t netSendEvent(Octet *buf, UInteger16 length, NetPath *netPath)
{
  ssize_t ret;
  struct sockaddr_in addr; // struttura per impostare gli indirizzi
  
  addr.sin_family = AF_INET;
  addr.sin_port = htons(PTP_EVENT_PORT);
  addr.sin_addr.s_addr = netPath->multicastAddr;
  
  
    RT_TASK *lxrtnettsk;                      //
      /* Initialize a real time buddy. */
    lxrtnettsk = rt_task_init(4900, 1, 0, 0);
    if (NULL == lxrtnettsk) {
        rt_dev_close(netPath->eventSock);
        printf("CANNOT INIT MASTER TASK\n");
        exit(1);
    }

    /* Switch over to hard realtime mode. */
    rt_make_hard_real_time();

    ret = rt_dev_send(netPath->eventSock, buf, length, 0);
//  ret = sendto(netPath->eventSock, buf, length, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); // sendto, è un dato di Imput/Output, dei socket
  if(ret <= 0)
    DBG("error sending multi-cast event message\n");
  
  if(netPath->unicastAddr)  //nethPath, consente di lavorare con file di vari percorssi, valori di stringa utilizzati per eseguire la totalità delle operazioni
  {
    addr.sin_addr.s_addr = netPath->unicastAddr;
    
//    ret = sendto(netPath->eventSock, buf, length, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));  ////ssize_t , è un tipo di dato per rappresentare le dimenzione dei blocchi, che possono essere letti o scritti in una sola operazione
    ret = rt_dev_send(netPath->eventSock, buf, length, 0);
    if(ret <= 0)
      DBG("error sending uni-cast event message\n");  //DBG , sono dei tipi di flies, in formato Portable Executable, conteneti informazioni di debug in formato codeView
  }
  
  
  	/* Switch over to soft realtime mode. */
   	 rt_make_soft_real_time();          // aggiunto !!

   	/* Delete realtime buddy. */
   	rt_task_delete(lxrtnettsk);     //aggiunto !!


  return ret;
}

ssize_t netSendGeneral(Octet *buf, UInteger16 length, NetPath *netPath)
{
  ssize_t ret;
  struct sockaddr_in addr;  // struttura per impostare gli indirizzi
  //'netRecvEvent';
  addr.sin_family = AF_INET;
  addr.sin_port = htons(PTP_GENERAL_PORT);
  addr.sin_addr.s_addr = netPath->multicastAddr;

    RT_TASK *lxrtnettsk;                      //
      /* Initialize a real time buddy. */
    lxrtnettsk = rt_task_init(4900, 1, 0, 0);
    if (NULL == lxrtnettsk) {
        rt_dev_close(netPath->eventSock);
        printf("CANNOT INIT MASTER TASK\n");
        exit(1);
    }

    /* Switch over to hard realtime mode. */
    rt_make_hard_real_time();

//  ret = sendto(netPath->generalSock, buf, length, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
    ret = rt_dev_send(netPath->generalSock, buf, length, 0);


	if(ret <= 0)
    DBG("error sending multi-cast general message\n");
  
  if(netPath->unicastAddr)
  {
    addr.sin_addr.s_addr = netPath->unicastAddr;
    
//    ret = sendto(netPath->eventSock, buf, length, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
    ret = rt_dev_send(netPath->eventSock, buf, length, 0);
    if(ret <= 0)
      DBG("error sending uni-cast general message\n");
  }
  

  	/* Switch over to soft realtime mode. */
   	 rt_make_soft_real_time();          // aggiunto !!

   	/* Delete realtime buddy. */
   	rt_task_delete(lxrtnettsk);     //aggiunto !!

  return ret;
}
GRAZIE MILLE PER L'AIUTO!!