2016-12-20 22 views
0

私はJavaScriptクライアントをC++サーバーに接続することができました(私はwinsockを使用しています)。サーバーはHTTPヘッダーを受信しますが、それ以降は何も送受信できません。 サーバーはメッセージを送信します(sendは送信バイト数を返します)が、クライアントには何も届きません。JavaScriptをWinsockに接続する

クライアント:JavaScriptの

function WebSocketTest() 
 
{ 
 
    if ("WebSocket" in window) 
 
    { 
 
    var ws = new WebSocket("ws://192.168.43.205:80"); 
 

 
    ws.onopen = function() 
 
    { 
 
     ws.send("Message to send");//this doesn't work 
 
    }; 
 

 
    ws.onmessage = function (evt) 
 
    { 
 
     var received_msg = evt.data; 
 
     alert("Message is received..."); 
 
     document.getElementById("message").innerHTML += received_msg; 
 
    }; 
 

 
    ws.onclose = function() 
 
    { 
 
     alert("Connection is closed..."); 
 
    }; 
 

 
    ws.onerror = function(error){ 
 
     alert('Error detected: ' + error); 
 
    } 
 
    } 
 

 
    else 
 
    { 
 
    // The browser doesn't support WebSocket 
 
    alert("WebSocket NOT supported by your Browser!"); 
 
    } 
 
}

サーバー:C/C++

#include <stdio.h> 
#include "winsock2.h" 
#include <iostream> 
#include <string> 

#pragma comment(lib, "Ws2_32.lib") 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 

using namespace std; 

void main() { 
    int size; 
    char buffer[1024]; 

    WSADATA wsaData; 
    sockaddr_in service; 
    SOCKET ListenSocket, AcceptSocket; 

    service.sin_family = AF_INET; 
    service.sin_addr.s_addr = INADDR_ANY; 
    service.sin_port = htons(10011); 

    WSAStartup(MAKEWORD(2, 2), &wsaData); 
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    bind(ListenSocket, (SOCKADDR*)&service, sizeof(service)); 
    listen(ListenSocket, SOMAXCONN); 

    AcceptSocket = accept(ListenSocket, NULL, NULL); 
    cout << "Client connected.\n"; 

    size = recv(AcceptSocket, buffer, 1024, 0); 
    string msg(buffer, size); 
    /* 
    msg contains this: 
     GET/HTTP/1.1 
     Host: 172.16.199.150:10011 
     Connection: Upgrade 
     Pragma: no-cache 
     Cache-Control: no-cache 
     Upgrade: websocket 
     Origin: http://localhost 
     Sec-WebSocket-Version: 13 
     User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
     Accept-Encoding: gzip, deflate, sdch 
     Accept-Language: en-US,en;q=0.8,hu;q=0.6 
     Sec-WebSocket-Key: 34qTtPYjnRJheHKQowePRg== 
     Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 
    */ 

    string abc = "abc"; 
    auto cmsg = abc.c_str(); 
    size = send(AcceptSocket, cmsg, abc.size(), 0); 
    // size == 3, which means send was successful, but client doesn't receive anything 

    // hangs here, even tho client sent a message 
    size = recv(AcceptSocket, buffer, 1024, 0); 
} 
+0

関連するすべてのコードについてコードを確認できますか? – mike510a

+0

この量の情報では続行できません。あなたはより具体的で、より多くの証拠と詳細を私たちに提供するかもしれません。 –

+0

webSocket接続は、全体の接続方式を使用し、独自のデータ形式(たとえば、独自のプロトコル)です。 webSocket接続を受信するには、webSocketプロトコル全体をサポートする必要があります。多くの言語のためのあらかじめ書かれた実装がたくさんあるので、ほとんどの人は、すべてを一から書き直すのではなく、既存のWebSocketサーバ実装を入手して使用します。その記事の[WebSocketサーバーの作成](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers)の概要を見ることができます。 – jfriend00

答えて

2

のWebSocket接続が全体の接続方式とそれ自身のデータ・フォーマットを使用しています(例えば、それはそのです独自のプロトコル)。 webSocket接続を受信するには、HTTP接続スキーム、セキュリティネゴシエーション、データフレームフォーマットなど、webSocketプロトコル全体をサポートする必要があります。

多くの言語用にあらかじめ記述された実装が多く存在するため、ほとんどの人は既存のwebSocketサーバ実装をすべてゼロから書き直すのではなく、取得して使用します。

この記事では、Writing webSocket serversの概要を確認することができます。

関連する問題