Я подозреваю, что ваша проблема связана с вашим write
:
err = write(sockfd, init, sizeof(init));
Второй параметр должен быть &init
, передача только init
будет эффективно развернуть структуру, и компьютер увидитчто-то вроде этого:
err = write(sockfd, init.en, init.pad, ..., sizeof(init));
Поскольку write
рассматривает только три аргумента, он будет использовать один из элементов init
в качестве размера буфера для записи, и этот член, вероятно, равен нулю.Фактический стек аргументов на уровне байтов зависит от компилятора и архитектуры, поэтому вы сами можете дразнить, что вы сами, главное, чтобы вы не выдавали write
того, что хотите.
Ваш компилятор должен был перехватитьэто, если этого не произошло, вам нужно развернуть опции предупреждений так высоко, как они будут идти.
Возможно, вы все равно захотите собрать данные, которые вы отправляете на байт байта X-сервера, чтобыТаким образом, вы можете убедиться, что вы правильно поняли порядок байтов и смещения.Отправка &init
доставит вам неприятности с обычными подозреваемыми (упаковка, выравнивание и порядок байтов).