Вы правы.
C17 draft § 6.5:
blockquote>
У объекта должно быть сохраненное значение, доступное только через выражение lvalue, которое имеет один из следующих типов: 89) < / sup>
тип, совместимый с эффективным типом объекта,
квалифицированная версия типа, совместимого с эффективным типом объекта. объект,
тип, который является типом со знаком или без знака, соответствующим эффективному типу объекта,
тип, который является тип со знаком или без знака, соответствующий квалифицированной версии действующего типа объекта,
- агрегатный или объединенный тип, который включает в себя один из вышеупомянутых типов среди своих членов (включая, рекурсивно, член субагрегированный или содержащий объединение), или
- тип символа.
В этом случае объект имеет тип
uint8_t[]
, а тип выражения lvalue -Message
. Ни одно из вышеперечисленных исключений не применимо.Использование
memcpy
для разыменования устраняет эту проблему, или, в качестве альтернативы, вы можете отключить строгие псевдонимы в вашем компиляторе, если хотите писать не на языке Си.Но даже после этого код имеет много проблем и не переносим: битовые поля крайне плохо определены в стандарте, а общие структуры - очень неуклюжий способ обработки сериализации. Вы должны воспользоваться возможностью десериализации каждого члена вручную.
Мне удалось узнать более длинный обветренный маршрут при помощи сокетов. Я нашел ответ на странице MSDN для IPEndPoint:
string getString = "GET /path/mypage.htm HTTP/1.1\r\nHost: www.mysite.mobi\r\nConnection: Close\r\n\r\n";
Encoding ASCII = Encoding.ASCII;
Byte[] byteGetString = ASCII.GetBytes(getString);
Byte[] receiveByte = new Byte[256];
Socket socket = null;
String strPage = null;
try
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("10.23.1.93"), 80);
socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ip);
}
catch (SocketException ex)
{
Console.WriteLine("Source:" + ex.Source);
Console.WriteLine("Message:" + ex.Message);
}
socket.Send(byteGetString, byteGetString.Length, 0);
Int32 bytes = socket.Receive(receiveByte, receiveByte.Length, 0);
strPage = strPage + ASCII.GetString(receiveByte, 0, bytes);
while (bytes > 0)
{
bytes = socket.Receive(receiveByte, receiveByte.Length, 0);
strPage = strPage + ASCII.GetString(receiveByte, 0, bytes);
}
socket.Close();
Хорошо, немного исследования поднимает это:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx? FeedbackID=384456
Кажется, что MS может сделать что-то об этом в какой-то момент.
Заголовок "Хоста" защищен и не может быть изменен программно. Я предполагаю для работы вокруг этого, Вы могли попытаться связать через отражение с частным свойством "InnerCollection" объекта WebRequest, и вызов площади "Набора" "Добавляют" метод на нем для изменения заголовка Хоста. Я не попробовал это, но от беглого взгляда на исходный код в Отражателе, я думаю, что он легко выполняется. Но да, привязка к частным собственностям объектов платформы не является лучшим способом выполнить вещи.:) Используйте, только если Вы ДОЛЖНЫ.
править: Или как другие упоминания парня в связанном вопросе, просто откройте сокет и сделайте быстрое "ДОБИРАЕТСЯ" вручную. Не должен быть никакой brainer, если Вы не должны переделывать другой материал, как cookie или безотносительно тонкостей, HttpWebRequest обеспечивает.
Я знаю, что это старая тема, но я столкнулся с такой же проблемой, и я нашел лучшее решение, чем использование сокетов или отражения...
Что я сделал, так это создал новый класс, который берется из WebHeaderCollection и обходит проверку того, что вы вставляете в него:
public class MyHeaderCollection:WebHeaderCollection
{
public new void Set(string name, string value)
{
AddWithoutValidate(name, value);
}
//or
public new string this[string name]
{
get { return base[name]; }
set { AddWithoutValidate(name, value); }
}
}
и вот как вы его используете:
var http = WebRequest.Create("http://example.com/");
var headers = new MyHeaderCollection();
http.Headers = headers;
//Now you can add/override anything you like without validation:
headers.Set("Host", http.RequestUri.Host);
//or
headers["Host"] = http.RequestUri.Host;
Надеюсь, это поможет всем, кто ищет это!