2015-12-15 5 views
1

Я хотел бы использовать функцию, которая заряжается, чтобы отправить «размер данных» и «данные» в конкретный дескриптор файла, используя write(). Он работает, когда длина записи равна 2 байтам. Тем не менее, я хотел бы использовать ту же функцию для отправки также длины записи, равной 1 байту.uint16_t uint8_t или size_t?

send_func(int port) 
{ 
    void *fd; 
    uint64_t fsize = 2517283; 
    uint64_t nbrBytes = 0; 
    uint16_t rsize; 
    int count; 
    ssize_t ret; 
    uint8_t Bsent = 0; 

    for (count = 1; nbrBytes < fsize; count++) 
    { 
     rsize = ((uint8_t*)fp)[nbrBytes]; 
     rsize += ((((uint8_t*)fp)[nbrBytes + 1]) << 8) & 0xFF00; 
     nbrBytes += 2; 

     // send size 
     ret = write(port, rsize, 2); 
     if (ret != 2) { 
      return -1; 
     } 
     // send data 
     ret = write(port, ((unsigned char*)fp) + Bsent, rsize - Bsent); 
     if (ret < 0) { 
      return -1; 
     } 
     Bsent += ret; 
    } 
} 

send_func(int port) 
{ 
    void *fd; 
    uint64_t fsize = 2517283; 
    uint64_t nbrBytes = 0; 
    size_t rsize; 
    int count; 
    ssize_t ret; 
    uint8_t Bsent = 0; 

    for (count = 1; nbrBytes < fsize; count++) 
    { 
     if (mode == ONLY_1_BYTE) { 
      rsize = ((uint8_t*)fp)[nbrBytes]; 
      rsize += ((((uint8_t*)fp)[nbrBytes + 1])); 
      nbrBytes += 1; 

      do { 
       // send data 
       ret = write(port, ((unsigned char*)fp) + Bsent, rsize - Bsent); 
       if (ret < 0) { 
        return -1; 
       } 
       Bsent += ret; 
      } while(Bsent < rsize)  
     } 
     else 
     { 
      rsize = ((uint8_t*)fp)[nbrBytes]; 
      rsize += ((((uint8_t*)fp)[nbrBytes + 1]) << 8) & 0xFF00; 
      nbrBytes += 2; 

      // send size 
      ret = write(port, rsize, sizeof(uint16_t)); 
      if (ret != 2) { 
       return -1; 
      }   
     } 

     do { 
      // send data 
      ret = write(port, ((unsigned char*)fp) + Bsent, rsize - Bsent); 
      if (ret < 0) { 
       return -1; 
      } 
      Bsent += ret; 
     } while(Bsent < rsize) 
    } 
} 

Поскольку имеется только один байт длины во втором случае, я добровольно удалили операцию endianity, который является обязательным в случае 2 байта.

Это лучший способ практиковать?

+0

Как объявляется и назначается record_size? Ваш код также никогда не обновляет 'Bsent'. –

ответ

1

Некоторые лучшие практики, которые вы можете применить, чтобы улучшить код объявления:

  • Не беспокойтесь об оптимизации один байт из потока. Это не имеет значения. Знаете ли вы, что каждый блок Ethernet занимает около 60 байтов накладных расходов, кроме вашей полезной нагрузки?
  • Не ручные коннекторы. Используйте встроенные функции, такие как htons().
  • Вам нужно учитывать «короткие записи», где возвращаемое значение от write() меньше, чем вы пытались отправить. Когда это произойдет, вам нужно снова зациклиться и вызвать write() без повторной отправки префикса длины.