UDP-пакеты не отправляются? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть простая программа на C, которая связывает сокет так, чтобы он мог получать и отправлять пакеты UDP. Он использует recvfrom для получения пакетов и вскоре после его получения он создает и отправляет ответ пакет, используя sendto очевидным способом, отправляя на тот же адрес и порт, о которых recvfrom сообщил.

Эта программа отлично работала в начальном тестировании, когда пакеты входили и выходили через обычный Ethernet интерфейс, eth0. Но сейчас я пытаюсь использовать его поверх ППС интерфейс, ppp0, и по какой-то причине он не работает.

sendto не сообщает об ошибках, но tcpdump не показывает пакеты выходят. (Показывает входящие пакеты, поэтому Я почти уверен, что tcpdump работает.)

И у меня есть существующая программа, которая делает то же самое вещь, но она работает правильно при любых обстоятельствах, на всех интерфейсы. Я еще не разобрался, как существующая программа может быть настройка его сокетов или логика отправки / получения иначе, это позволяет ему работать, пока моя новая, более простая программа терпит неудачу.

Некоторые пакеты большие (приближаются к MTU), но много из них маленькие (<100 байт), и ни один из них не получает через, так что я не думаю, что это проблема MTU. </p>

Может кто-нибудь придумать что-нибудь, что может привести к сбою отправленного пакета выйти таким образом? (Я не говорю, что это как-то связано с ppp; то, что он не работает под ppp, для меня может быть совпадением или ключевой частью проблемы.)

Извините, я не могу опубликовать фактический код; это на работе, а я дома. Соответствующая часть выглядит примерно так:

struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
char buf[1600];
int r, r2;

r = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&addr, &addrlen);

/* ... */

r2 = sendto(sock, buf2, n2, 0, (struct sockaddr *)&addr, addrlen);

(Если вам нужен более полный пример, я могу опубликовать это завтра.)

1 Ответ

0 голосов
/ 17 мая 2018

Если ни один из трафика не работает:

Возможно, проблема с маршрутизацией.Проверьте таблицу маршрутизации хоста.

Вы также можете проверить с помощью tcpdump, что трафик не выходит через неправильный интерфейс.Например:

Если вы ожидаете увидеть трафик в ppp0 с помощью команды:

tcpdump -i ppp0 порт udp 123

А вы этого не делаетепросмотрите требуемый трафик, затем проверьте другие интерфейсы с помощью аналогичной команды, чтобы убедиться, что трафик не выходит через неправильный интерфейс:

tcpdump -i eth0 порт udp 123

Если часть трафика работает:

Если вы используете какую-либо мобильную сеть (часто используемую через ppp0), то ваша скорость восходящей линии связи может быть ниже скорости нисходящей линии.

Так чтоклиент может отправить больше трафика на ваш сервер (по нисходящей линии связи), чем может передать восходящая линия связи.

Поскольку UDP не обладает такой надежностью и контролем перегрузки / потока, как TCP, UDP может отбрасывать некоторые пакеты при перегрузке.ситуация.

...