我正在開發一個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;
}
}
我看不到任何這類問題的代碼,所以我希望其他幾個組的眼睛可能可以。謝謝。
您使用的主機的價值是什麼?它是否爲ws://前綴(不確定這是否有助於強制MessageWebSocket使用HTTP而不是HTTPS,但值得一試)? –
我指定了「ws://192.168.1.1:443 /」 – OzBarry
實際上,現在我仔細看看您粘貼的內容(以及您可以閱讀請求明文的事實),看起來您粘貼了一個完整的以太網幀。前14個字節可能是一個以太網頭,接着是一個IP頭(從'45 00 00 C3'開始),接着是TCP頭(從'C2 4F 01 BB'開始;注意'01 BB'是你的目的端口443),然後是TCP有效載荷(從'47 45 54 20'開始;請求數據)。沒有使用TLS。你有權訪問節點服務器的日誌嗎?請求通過了什麼? –