Вручную отправить в iperf через сокет UDP? (С++)

У меня есть программа, которая должна измерять общие потери после маршрутизации через машину.

По сути, я генерирую 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 и не вижу ничего странного.


person Ashkay    schedule 15.06.2015    source источник


Ответы (1)


Интересно. Оказалось, что проблема была устранена путем назначения устройства TUN на машине A IP-адресу eth0. Раньше я назначал устройству TUN его собственный IP-адрес (я пытался удалить IP-адрес с устройства TUN, но по умолчанию он был равен eth1. Это тоже не сработало).

Я предполагаю, что из-за этого произошли некоторые изменения, или что какое-то туннелирование/соединение не было установлено iperf, потому что пакеты не отправлялись из eth0 раньше.

Если у кого-то есть какие-либо дополнительные сведения о том, как/почему это работает, мне было бы очень интересно.

person Ashkay    schedule 15.06.2015