2016-12-20 11 views
0

Мне удалось подключить мой клиент JavaScript к серверу C++ (я использую winsock), и сервер получает HTTP-заголовок, но после этого я не могу отправлять и получать что-либо еще. Сервер отправляет сообщение (send возвращает количество отправленных байтов), но ничего не приходит на клиент.Подключить JavaScript WebSocket к C 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, а не переписывают все это с нуля. Вы можете увидеть обзор того, что требуется для [Написание веб-серверов] (https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers) в этой статье. – jfriend00

ответ

2

соединение WebSocket использует всю схему подключения и собственный формат данных (например, это его собственный протокол). Чтобы получать соединения через webSocket, вы должны поддерживать весь протокол webSocket, включая схему подключения HTTP, согласование безопасности и формат фрейма данных.

Поскольку существует много предварительно написанных реализаций для большого количества языков, большинство людей получат и используют существующую реализацию сервера webSocket, а не переписывают все это с нуля.

Вы можете увидеть, что нужно для Writing webSocket servers в этой статье.