Адрес структуры совпадает с адресом первого члена?
Да, на самом деле это предусмотрено стандартами C и C ++. Из стандарта С:
6.7.2.1-13. Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный элемент
Размер вашего struct
должен составлять два байта. Вы не должны преобразовывать указатель на него в char*
, однако: вместо этого вы должны использовать memcpy
, чтобы скопировать ваш Bitmask
в буфер, который вы отправляете по сети.
РЕДАКТИРОВАТЬ Так как вы используете сборку ввода-вывода с iovec
, вам не нужно приводить Bitmask
к чему-либо: iov_base
равно void*
, поэтому вы можете просто установить iov[0].iov_base = header;
Примечание. Это работает только в том случае, если ваш struct
не содержит виртуальных функций, базовых классов и т. Д. (Спасибо, Тимо).
EDIT2
Чтобы получить {0x81, 0x05} в вашем struct
, вы должны изменить порядок элементов структуры следующим образом:
struct Bitmask {
unsigned char opcode: 4;
unsigned char rsv3: 1;
unsigned char rsv2: 1;
unsigned char rsv1: 1;
unsigned char fin: 1;
unsigned char payload_length: 7;
unsigned char mask: 1;
}