none
SocketStream 与80端口通信的时候获取Header问题 RRS feed

  • 问题

  • 代码:

    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信息。

    谢谢

    2012年9月28日 10:10

答案

  • 托管代码看不大懂。

    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
    2012年9月30日 12:38
    版主

全部回复

  • 托管代码看不大懂。

    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
    2012年9月30日 12:38
    版主
  • 貌似不是那个问题。我在服务器端看到了请求。并且请求成功了。但是现在出现的问题是:该操作尝试访问的数据超出了有效范围

    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 增加相关代码块
    2012年10月8日 8:39