2013-01-22 72 views
0

我正在開發一個Windows 8應用程序,該應用程序使用node.js/socket.io與node.js服務器進行通信,並且遇到了連接問題。我決定運行一個tcp嗅探器應用程序(microsoft network monitor 3.4),並且注意到在發送http請求之前,我的字符串中有一堆垃圾:Windows 8 MessageWebSocket 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..Ã[email protected]€...À¨.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,因爲一些智能手機只允許websockets在該端口上創建套接字連接。

在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; 
    } 
} 

我看不到任何這類問題的代碼,所以我希望其他幾個組的眼睛可能可以。謝謝。

+0

您使用的主機的價值是什麼?它是否爲ws://前綴(不確定這是否有助於強制MessageWebSocket使用HTTP而不是HTTPS,但值得一試)? –

+0

我指定了「ws://192.168.1.1:443 /」 – OzBarry

+1

實際上,現在我仔細看看您粘貼的內容(以及您可以閱讀請求明文的事實),看起來您粘貼了一個完整的以太網幀。前14個字節可能是一個以太網頭,接着是一個IP頭(從'45 00 00 C3'開始),接着是TCP頭(從'C2 4F 01 BB'開始;注意'01 BB'是你的目的端口443),然後是TCP有效載荷(從'47 45 54 20'開始;請求數據)。沒有使用TLS。你有權訪問節點服務器的日誌嗎?請求通過了什麼? –

回答

1

您粘貼的內容似乎是Ethernet frame,但由於網絡接口沒有收到它,因此剝離了8個字節(7字節前導碼和1個字節的起始幀定界符)。

第一14個字節是Ethernet header:爲目的地MAC地址的6個字節,6個字節的源MAC地址,和2個字節用於EtherType,與08 00表示它是IPv4分組。

以太網有效載荷遵循以太網報頭,並且在這種情況下,是一個IP datagram,所以它開始與IP header在與字節45表示IPv4標頭具有20個字節的首部長度的偏移14。在偏移23處,您會發現IP協議06表示TCP。在偏移26處,您可以找到源IP地址(C0 A8 01 71,即192.168.1.113)。在偏移30處,您會找到目標IP地址。

IP負載如下IP報頭,並且,在這種情況下,它是一個TCP segment開始與TCP header在偏移34個字節表示C2 4F的49743源端口和字節01 BB表示的443的目的地端口。在偏移46您有50表示20個字節的TCP標頭長度。

TCP有效負載在TCP報頭之後,並且在這種情況下是從偏移量54開始的HTTP,字節47 45 54 ...是「GET ...」。

這個請求數據包看起來很健壯。我相信你的問題在別處。