node.js/socket.io を使用して node.js サーバーと通信する Windows 8 アプリを開発していますが、接続に関する問題が山積しています。tcp スニファー アプリケーション (Microsoft ネットワーク モニター 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 ではありません。一部のスマートフォンでは、websocket がそのポートでソケット接続を作成することしか許可されていないため、443 を使用する必要があります。
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;
}
}
コードには何の問題も見られないので、他のいくつかの目で見られることを期待していました。ありがとう。