У меня есть простая программа на 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);
(Если вам нужен более полный пример, я могу опубликовать это завтра.)