0

我正在开发一个 Windows 8 应用程序,它使用 node.js/socket.io 与 node.js 服务器通信,并且遇到了一堆连接问题。我决定运行一个 tcp 嗅探器应用程序(microsoft network monitor 3.4),并注意到在发送 http 请求之前,我的字符串中有一堆垃圾:

C8 D7 19 87 09 1C C8 60 00 13 8C FA 08 00 45 00 00 C3 37 78 40 00 80 06 00 00 C0 A8 01 71 17 17 5C 67 C2 4F 01 BB 06 1A 36 71 A2 8B 48 C7 50 18 04 00 36 4D 00 00 47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A 53 65 63 2D 57 65 62 53 6F 63 6B 65 74 2D 4B 65 79 3A 20 76 46 46 30 4F 4C 2F 55 63 53 49 6E 6F 70 46 67 52 69 6F 52 73 77 3D 3D 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 55 70 67 72 61 64 65 0D 0A 55 70 67 72 61 64 65 3A 20 57 65 62 73 6F 63 6B 65 74 0D 0A 53 65 63 2D 57 65 62 53 6F 63 6B 65 74 2D 56 65 72 73 69 6F 6E 3A 20 31 33 0D 0A 48 6F 73 74 3A 20 32 33 2E 32 33 2E 39 32 2E 31 30 33 3A 34 34 33 0D 0A 0D 0A È×.‡..È`..Œú..E..Ã7x@.€...À¨.q..\gÂO.»..6q¢‹HÇP...6M..GET / HTTP/1.1..Sec-WebSocket-Key: vFF0OL/UcSInopFgRioRsw==..Connection: Upgrade..Upgrade: Websocket..Sec-WebSocket-Version: 13..Host: 192.168.1.1:443....(在大多数情况下,点是 \r\n)

虽然我使用的是 443 端口,但这不是一个安全的 websocket——我被迫使用 443,因为一些智能手机只允许 websocket 在该端口上创建套接字连接。

在 C++ 中,我正在创建 websocket,如下所示:

void Websocket::Connect(Platform::String ^host)
{
  if ( this->socket != nullptr ) return;
  try
  {
    Uri^ address = ref new Uri(host);
    readBuffer = ref new Buffer(1000);
    this->socket = ref new MessageWebSocket();
    this->socket->Control->MessageType = SocketMessageType::Utf8;
    this->socket->Control->MaxMessageSize = 512;
    this->socket->Closed += ref new TypedEventHandler<IWebSocket^, WebSocketClosedEventArgs^>( this, &Websocket::ServerClosed );
    this->socket->MessageReceived += ref new TypedEventHandler<MessageWebSocket^, MessageWebSocketMessageReceivedEventArgs^>( this, &Websocket::MessageRecv );
    create_task(this->socket->ConnectAsync(address)).then([this](task<void> previousTask)
    {
      try
      {
        concurrency::task_status status = previousTask.wait();
        switch( status ) {
        case concurrency::task_status::completed:
          this->connected = true;
          break;
        default:
          socketErrorString = ref new Platform::String( L"Connection was cancelled" );
        }
      }
      catch(Exception^ exception)
      {
        this->connected = false;
        socketErrorString = ref new Platform::String( exception->Message->Data() );
        this->socket = nullptr;
      } catch( ... ) {
        this->connected = false;
        socketErrorString = ref new Platform::String( L"Unknown exception caught (inside connect)" );
        this->socket = nullptr;
      }
    });
  } catch( Exception ^exc ) {
    this->connected = false;
    socketErrorString = exc->Message; //ref new Platform::String( L"Unknown exception caught (outside connect)" );
    this->socket = nullptr;
  }
}

我在代码中看不到任何类型的问题,所以我希望其他几组眼睛也能看到。谢谢。

4

1 回答 1

1

What you've pasted appears to be an Ethernet frame, but with 8 bytes stripped (7-byte preamble and 1-byte Start Frame Delimiter) because the network interface doesn't receive it.

The first fourteen bytes are the Ethernet header: 6 bytes for the destination MAC address, 6 bytes for the source MAC address, and 2 bytes for the EtherType, with 08 00 denoting that it is IPv4 packet.

The Ethernet payload follows the Ethernet header and, in this case, is an IP datagram, so it starts with an IP header at offset 14 with byte 45 denoting an IPv4 header with a header length of 20 bytes. At offset 23 you'll find the IP protocol of 06 denoting TCP. At offset 26 you'll find the source IP address (C0 A8 01 71, i.e. 192.168.1.113). At offset 30 you'll find the destination IP address.

The IP payload follows the IP header, and, in this case, it is a TCP segment starting with a TCP header at offset 34 with bytes C2 4F denoting a source port of 49743 and bytes 01 BB denoting a destination port of 443. At offset 46 you have 50 denoting a TCP header length of 20 bytes.

The TCP payload follows the TCP header, and, in this case, is HTTP starting at offset 54 with bytes 47 45 54 ... being "GET...".

This request packet appears to be wellformed. I believe your problem lies elsewhere.

于 2013-01-24T19:17:45.947 回答