У меня есть программа, которая должна измерять общие потери после маршрутизации через машину.
По сути, я генерирую UDP-трафик с iperf
на машине A, который предназначен для машины C. Однако я сначала направляю этот трафик через машину B**, а затем отправляю его на машину C через необработанный сокет на порт 5001 (порт по умолчанию, который iperf
слушает) с sendto()
. При выполнении tcpdump
показывает, что пакеты принимаются на машине C, сервер iperf
не видит ни этих подключений, ни пакета.
Я немного покопался в исходном коде iperf
, чтобы увидеть, как он работает, и вижу, что пакеты принимаются с помощью функции
rc = recvfrom( mSettings->mSock, mBuf, mSettings->mBufLen, 0,
(struct sockaddr*) &server->peer, &server->size_peer );.
По сути, поскольку это просто recvfrom
, я не понимаю, в чем проблема, если я абсолютно уверен, что никогда не изменяю пакеты и отправляю их с помощью функции sendto(s, buf, len, 0, (struct sockaddr*) &si_other, slen)
и socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
.
У кого-нибудь есть идеи? Почему iperf
не замечает этой связи?
** На самом деле я направляю пакеты на устройство TUN на машине A, затем читаю их из программы пользовательского пространства на A, отправляю их на B с помощью сокета UDP, читаю их в программе пользовательского пространства на B, а затем отправляю их через необработанный сокет. с отключенным IP_HDRINCL
. Я распечатываю заголовки при получении на машинах A и B и не вижу ничего странного.