Вот лучший способ инициализировать ваше сообщение:
static const char header[] = { '\x00', '\x00', '\x01', '\x82', '\x00',
'\x06', '\x01', '\x01', '\x20', '\x01',
'\x25', '\x04' };
vector<char> msg(header, header + (sizeof(header) / sizeof(header[0])));
В C ++ 11 вы могли бы, конечно, сделать это:
vector<char> msg { '\x00', '\x00', '\x01', '\x82', '\x00', '\x06',
'\x01', '\x01', '\x20', '\x01', '\x25', '\x04' };
Что касается уловки swap
, упомянутой в другом месте ... Я не думаю, что это хорошая идея. Если в вашем буфере иногда нет абсолютно огромных сообщений, а затем вы возвращаетесь к относительно маленьким сообщениям, вы теряете больше, чем вы получаете с помощью трюка swap
. Вы не хотите, чтобы нижележащий вектор постоянно выделял память, а замена новым пустым вектором заставляет в точности это произойти.
Кстати, вызов конструктора можно заменить вызовом assign
при повторном использовании вектора, например так:
msg.assign(header, header + (sizeof(header) / sizeof(header[0]));
Также существует проблема с вашим кодом. Вы не проверяете, что размер файла будет соответствовать 16-битному значению. Это означает, что если вы попытаетесь отправить файл, который слишком велик для поля размера в вашем сообщении, у вас будет неправильное поле размера. Это особенно неприятно, поскольку вы отправляете весь файл независимо от того, что находится в поле размера. Это означает, что в некоторых случаях содержимое файла может интерпретироваться как заголовок для следующего сообщения.
К счастью (хотя я ожидаю довольно случайно), использование tellg
, resize
и read
сговорились, чтобы гарантировать, что вы будете аварийно завершать работу из-за нехватки памяти, а не переполнять буфер, если ваш Файл слишком большой, чтобы поместиться в буфер в памяти. Хотя есть вероятность отрицательного опустошения, если размер вашего файла превышает 2G. Я не рискну догадываться, что произойдет, если это произойдет. length
, вероятно, не должно быть целым числом. Выясните, какой тип tellg
должен вам дать, и используйте его вместо этого.