Чтение данных из сокета UDP - PullRequest
0 голосов
/ 09 апреля 2011

Я использую следующую функцию для чтения из файлового дескриптора ...

int cread(int fd, char *buf, int n){

  int nread;

  if((nread=read(fd, buf, n))<0){
    perror("Reading data");
    exit(1);
  }
  return nread;
}

Ниже приводится функция, которая использует вышеуказанную функцию

if(FD_ISSET(tap_fd, &rd_set)){
  /* data from tun/tap: just read it and write it to the network */

  nread = cread(tap_fd, buffer, BUFSIZE);

  tap2net++;
  do_debug("TAP2NET %lu: Read %d bytes from the tap interface\n", tap2net, nread);

  /* write length + packet */
  plength = htons(nread);
  nwrite = cwrite(net_fd, (char *)&plength, sizeof(plength));
  nwrite = cwrite(net_fd, buffer, nread);

  do_debug("TAP2NET %lu: Written %d bytes to the network\n", tap2net, nwrite);
}

Они оба отлично работают с TCPSiocket, но не с разъемом UDP. Любая помощь будет оценена

1 Ответ

0 голосов
/ 10 апреля 2011

Непонятно, в чем именно ваша проблема, но если net_fd является сокетом UDP, то два вызова cwrite() создадут две дейтаграммы UDP.

Нет большой смысла в предопределении размера с помощью UDP - UDP поддерживает границы сообщений для вас. Так что в случае с UDP, просто полностью удалите часть plength.

...