Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.36 KB | None | 0 0
  1. // PEZZO DEL READER INCRIMINATO =============================================================
  2.  
  3. /* Prendo un file descriptor da cui leggere */
  4.             source = fdpop();
  5.             printf("Reader: Reading from %d\n", source);
  6.            
  7.             /* Leggo un message_t da quel file descriptor */
  8.             if (acquireFdMutex(source) < 0) perror("fdMutex");
  9.             read_out = readMsg(source, &msg);
  10.             if (releaseFdMutex(source) < 0) perror("fdMutex");
  11.            
  12.             if (read_out < 0) { perror("readMsg");}
  13.             else if (read_out == 0) { printf("Reader: client connesso sul fd %d caduto\n", source); freeReq(req); }
  14.  
  15.  
  16. // DICHIARAZIONE DELLA READMSG ===============================================================
  17. int readHeader(long connfd, message_hdr_t *hdr) {
  18.     int rd;
  19.     /* Leggo dal file descriptor l'header */
  20.     rd = readn(connfd, hdr, sizeof(message_hdr_t));
  21.     if (rd < 0) errno = EIO;
  22.    
  23.     return rd;
  24. }
  25.  
  26. int readData(long fd, message_data_t *data) {
  27.     int rd1, rd2;
  28.    
  29.     /* Leggo l'header del contenuto del messaggio */
  30.     rd1 = readn(fd, &(data->hdr), sizeof(message_data_hdr_t));
  31.     if (rd1 < 0) errno = EIO;
  32.     if (rd1 <= 0) return rd1;
  33.    
  34.     /* Leggo il contenuto del messaggio */
  35.     rd2 = readn(fd, data->buf, data->hdr.len);
  36.     if (rd2 < 0) errno = EIO;
  37.     if (rd2 <= 0) return rd2;
  38.    
  39.     return rd1 + rd2;
  40. }
  41.  
  42. int readMsg(long fd, message_t *msg) {
  43.     int rd1, rd2;
  44.    
  45.     /* Leggo l'header del messaggio */
  46.     rd1 = readHeader(fd, &(msg->hdr));
  47.     if (rd1 < 0) errno = EIO;
  48.     if (rd1 <= 0) return rd1;
  49.    
  50.     /* Leggo il campo data del messaggio */
  51.     rd2 = readData(fd, &(msg->data));
  52.     if (rd2 < 0) errno = EIO;
  53.     if (rd2 <= 0) return rd2;
  54.    
  55.     return rd1 + rd2;
  56. }
  57.  
  58. // STRUTTURA DEL MESSAGE_T ==================================================================================
  59. /**
  60.  *  @struct header
  61.  *  @brief header del messaggio
  62.  *
  63.  *  @var op tipo di operazione richiesta al server
  64.  *  @var sender nickname del mittente
  65.  */
  66. typedef struct {
  67.     op_t     op;  
  68.     char sender[MAX_NAME_LENGTH+1];
  69. } message_hdr_t;
  70.  
  71. /**
  72.  *  @struct header
  73.  *  @brief header della parte dati
  74.  *
  75.  *  @var receiver nickname del ricevente
  76.  *  @var len lunghezza del buffer dati
  77.  */
  78. typedef struct {
  79.     char receiver[MAX_NAME_LENGTH+1];
  80.     unsigned int   len;  
  81. } message_data_hdr_t;
  82.  
  83. /**
  84.  *  @struct data
  85.  *  @brief body del messaggio
  86.  *
  87.  *  @var hdr header della parte dati
  88.  *  @var buf buffer dati
  89.  */
  90. typedef struct {
  91.     message_data_hdr_t  hdr;
  92.     char               *buf;
  93. } message_data_t;
  94.  
  95. /**
  96.  *  @struct messaggio
  97.  *  @brief tipo del messaggio
  98.  *
  99.  *  @var hdr header
  100.  *  @var data dati
  101.  */
  102. typedef struct {
  103.     message_hdr_t  hdr;
  104.     message_data_t data;
  105. } message_t;
  106.  
  107. // FUNZIONE READN ==========================================================================
  108. /**
  109.  * @function readn
  110.  * @brief Legge da un file descriptor fd
  111.  *
  112.  * @param fd File descriptor da cui leggere
  113.  * @param buf Buffer in cui scrivere
  114.  * @param size Lunghezza del messaggio da leggere
  115.  *
  116.  * @return la lunghezza del messaggio letto, -1 se errore
  117.  */
  118. static inline int readn(long fd, void *buf, size_t size) {
  119.     size_t left = size;
  120.     int r;
  121.     char *bufptr = (char*)buf;
  122.     while(left>0) {
  123.     if ((r=read((int)fd ,bufptr,left)) == -1) {
  124.         if (errno == EINTR) continue;
  125.         return -1;
  126.     }
  127.     if (r == 0) return 0;   // gestione chiusura socket
  128.         left    -= r;
  129.     bufptr  += r;
  130.     }
  131.     return size;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement