printf("recv: %x\n", buf);
ожидает, что buf
будет int
, который печатается в шестнадцатеричном формате.Но buf
не является int
;это char*
(после распада).Таким образом, вы врете printf
о типе buf
, вызывая неопределенное поведение.Одним из возможных выражений UB будет то, что напечатанное шестнадцатеричное значение - это последние 32 бита адреса вашего буфера, который, безусловно, не будет иметь никакого отношения к полученным данным.
Если бы вы скомпилировали с -Wall
, ваш компилятор предупредил бы вас об этом.
Он мог бы также предупредить вас о том, что вы не используете возвращаемое значение recvfrom
.Поскольку передачи UDP могут включать байты NUL (и, следовательно, обычно не являются строками C, которые не могут содержать NUL), вам необходимо знать, сколько байтов вы получили.recvfrom
предоставляет эту информацию в качестве возвращаемого значения, которое также сообщит вам, произошла ошибка или нет.Нет другого способа узнать, сколько байтов было получено, поэтому использование возвращаемого значения эффективно обязательно.
Поскольку пакет, полученный с помощью recvfrom
, не будет завершен NUL, нет смысла резервироватьбайт для завершения NUL;это не будет использоваться.(Если бы вы точно знали, что пакеты являются строками, и вы хотели, чтобы буфер заканчивался NUL, вам придется делать это самостоятельно, используя длину, возвращаемую recvfrom
. В этом случае вам нужно будет оставить место длябайт.)