2016-12-20 5 views
0

Ich konnte meinen JavaScript-Client mit C++ - Server verbinden (ich verwende Winsock), und der Server empfängt einen HTTP-Header, aber ich kann danach nichts mehr senden oder empfangen. Der Server sendet die Nachricht (send gibt die Anzahl der gesendeten Bytes zurück), aber nichts kommt auf dem Client an.Verbinden Sie JavaScript WebSocket mit C Winsock

Auftraggeber: 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!"); 
 
    } 
 
}

Server: 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

Können wir Ihren Code für alle verwandten Teile sehen? – mike510a

+0

Wir können nicht mit dieser Menge an Informationen fortfahren. Sie könnten genauer sein und uns mehr Beweise und Details liefern. –

+0

Eine WebSocket-Verbindung verwendet ein ganzes Verbindungsschema und ein eigenes Datenformat (z. B. ein eigenes Protokoll). Um webSocket-Verbindungen zu erhalten, müssen Sie das gesamte webSocket-Protokoll unterstützen. Da es viele vorgefertigte Implementierungen für viele Sprachen gibt, werden die meisten Benutzer eine vorhandene webSocket Serverimplementierung erhalten und verwenden, anstatt sie von Grund auf neu zu schreiben. In diesem Artikel finden Sie eine Übersicht über die Anforderungen von [Schreiben von webSocket-Servern] (https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers). – jfriend00

Antwort

2

A WebSocket-Verbindung verwendet ein ganzes Verbindungsschema und eine eigenes Datenformat (zB es ist sein eigenes Protokoll). Um webSocket-Verbindungen zu empfangen, müssen Sie das gesamte webSocket-Protokoll unterstützen, einschließlich des HTTP-Verbindungsschemas, der Sicherheitsvereinbarung und des Datenrahmenformats.

Da es viele vordefinierte Implementierungen für viele Sprachen gibt, werden die meisten Benutzer eine vorhandene webSocket Serverimplementierung erhalten und verwenden, anstatt sie von Grund auf neu zu schreiben.

Sie können in diesem Artikel einen Überblick über das, was es für Writing webSocket servers dauert.