簡體   English   中英

將JavaScript WebSocket連接到C winsock

[英]Connect JavaScript WebSocket to C winsock

我設法將JavaScript客戶端連接到C ++服務器(我正在使用winsock),並且服務器接收到HTTP標頭,但此后我無法發送或接收其他任何內容。 服務器發送消息(發送返回發送的字節數),但是客戶端上什么也沒有到達。

客戶端: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);
}

webSocket連接使用整個連接方案,並且使用自己的數據格式(例如,它是自己的協議)。 要接收webSocket連接,您必須支持整個webSocket協議,包括HTTP連接方案,安全協商和數據幀格式。

由於有許多針對多種語言的預編寫實現,因此大多數人將獲得並使用現有的webSocket服務器實現,而不是從頭開始重寫所有實現。

您可以在該文章中看到編寫WebSocket服務器所需的概述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM