将 JavaScript WebSocket 连接到 C winsock

Posted

技术标签:

【中文标题】将 JavaScript WebSocket 连接到 C winsock【英文标题】:Connect JavaScript WebSocket to C winsock 【发布时间】:2016-12-20 09:38:48 【问题描述】:

我设法将我的 javascript 客户端连接到 C++ 服务器(我正在使用 winsock),并且服务器接收到 HTTP 标头,但之后我无法发送或接收任何其他内容。 服务器发送消息(send 返回发送的字节数),但没有任何东西到达客户端。

客户端: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 协议。由于许多语言都有许多预先编写的实现,因此大多数人将获得并使用现有的 webSocket 服务器实现,而不是从头开始重写。您可以在该文章中查看Writing webSocket servers 所需的概述。 【参考方案1】:

一个 webSocket 连接使用一个完整的连接方案和它自己的数据格式(例如它是它自己的协议)。要接收 webSocket 连接,您必须支持整个 webSocket 协议,包括 HTTP 连接方案、安全协商和数据帧格式。

由于许多语言都有许多预先编写的实现,大多数人将获得并使用现有的 webSocket 服务器实现,而不是从头开始重写。

您可以在该文章中查看Writing webSocket servers 所需的概述。

【讨论】:

以上是关于将 JavaScript WebSocket 连接到 C winsock的主要内容,如果未能解决你的问题,请参考以下文章

javascript客户端和netty服务器之间的安全websocket连接

使用 nginx 作为 websocket 连接的代理

使用 websocket javascript 客户端发送文件

websocket连接失败?

在 JavaScript 中使用 WebSocket 时出错

在网络工作者或服务工作者中运行 websocket - javascript