积极答复者
SocketStream 与80端口通信的时候获取Header问题

问题
-
代码:
HostName^ hostname;
hostname = ref new HostName("ericye.in");
StreamSocket^ osk = ref new StreamSocket();
CoreApplication::Properties->Insert("connected_lekan", osk);
task<void>(osk->ConnectAsync(hostname,L"80", SocketProtectionLevel::PlainSocket)).then([this] (task<void> previousTask)
{
previousTask.get();
StreamSocket^ socket = dynamic_cast<StreamSocket^>(CoreApplication::Properties->Lookup("connected_lekan"));
DataWriter^ socket_write = ref new DataWriter(socket->OutputStream);
String^ write_string_new = ref new String(L"GET /css/layout.css HTTP/1.0\r\nHost: ericye.in\r\nUser-Agent: Win8\r\n\r\n");
socket_write->WriteUInt32(socket_write->MeasureString(write_string_new));
socket_write->WriteString(write_string_new);
task<unsigned int>(socket_write->StoreAsync()).then([this, socket, write_string_new] (task<unsigned int> writeTask){
try
{
DataReader^ res = ref new DataReader(socket->InputStream);
uint32 stringLength= 1024;
task<unsigned int>(res->LoadAsync(1024)).then([this, res, stringLength] (unsigned int actualStringLength)
{
byte by = res->ReadByte();
String^ data = res->ReadString(res->UnconsumedBufferLength);
return;
});
}
catch (Exception^ exception)
{
return;
}
});
});
通过上面的代码能获取网页正文。但是无法获取Header信息。
谢谢
答案
-
托管代码看不大懂。
String^ write_string_new = ref new String(L"GET /css/layout.css HTTP/1.0\r\nHost: ericye.in\r\nUser-Agent: Win8\r\n\r\n");
应该是L导致的,L的意思是wchar_t类型的数据(一个字母占两个字节)
而一般在网络上用的都是char,所以对方服务器是理解不了你这句话的,应该会直接把你关闭
0xDEADBEEF
- 已标记为答案 Eric_00101 2012年10月8日 10:08
全部回复
-
托管代码看不大懂。
String^ write_string_new = ref new String(L"GET /css/layout.css HTTP/1.0\r\nHost: ericye.in\r\nUser-Agent: Win8\r\n\r\n");
应该是L导致的,L的意思是wchar_t类型的数据(一个字母占两个字节)
而一般在网络上用的都是char,所以对方服务器是理解不了你这句话的,应该会直接把你关闭
0xDEADBEEF
- 已标记为答案 Eric_00101 2012年10月8日 10:08
-
貌似不是那个问题。我在服务器端看到了请求。并且请求成功了。但是现在出现的问题是:该操作尝试访问的数据超出了有效范围
task<unsigned int>(socket_write->StoreAsync()).then([this, socket, write_string_new] (task<unsigned int> writeTask){
try
{
//writeTask.get();
DataReader^ res = ref new DataReader(socket->InputStream);
uint32 stringLength= res->ReadInt32();
task<unsigned int>(res->LoadAsync(stringLength)).then([this, res, stringLength] (unsigned int actualStringLength)
{
String^ data = res->ReadString(res->UnconsumedBufferLength);
return;
});
}
catch (Exception^ exception)
{
xids->Text = "Error:"+exception->Message;
return;
}
});
- 已编辑 Eric_00101 2012年10月8日 8:43 增加相关代码块