【问题标题】:Websocket connection keeps prematurely closing the connectionWebsocket连接保持过早关闭连接
【发布时间】:2017-04-22 20:55:03
【问题描述】:

所以,我正在尝试构建一个用作 Websockets 服务器的 C 应用程序。这里有很多相关的问题,但似乎没有一个能够帮助解决这个问题。该程序能够初步建立连接,成功完成 websocket 的握手,但是似乎无法保持连接打开。在客户端,我收到错误

WebSocket.js:7605 未捕获错误:尝试在未打开或关闭的 WebSocket 上发送消息 在 _8b2.window.WebSocket._8d2.send (WebSocket.js:7605) 在(索引):34

每当我尝试在客户端的 websocket 连接上使用 send() 函数时。而且它也给了我错误

与“ws://127.0.0.1:5959/?.kl=Y”的 WebSocket 连接失败:在建立连接之前 WebSocket 已关闭。

这里是服务器的源代码:

 int new_socket;
int activity;
int i;
int sd;
int max_sd;
int bytes_read;
fd_set readfds;
int master_socket;
noPollConn* new_conn;
/*Create no poll context*/
noPollCtx* ctx = nopoll_ctx_new();
noPollConn* conn;
char buffer[3000];
/*Create a connection listener at 127.0.0.1 (loopback) on port 5959*/
noPollConn * listener = nopoll_listener_new(ctx, "127.0.0.1","5959");
/*Get the socket of the lister*/
master_socket = nopoll_conn_socket(listener);
if(!nopoll_conn_is_ok(listener)) {
    perror("There was an error creating the listener!\n");
    exit(EXIT_FAILURE);
}
puts("Waiting for connections ...");

while(TRUE){
    printf("Start of the while loop\n");
    FD_ZERO(&readfds);
    FD_SET(master_socket, &readfds);
    max_sd = master_socket;
    printf("The number of connections is %i\n",cons);

    for (i = 0 ; i < cons ; i++) {
        sd = nopoll_conn_socket((noPollConn*)vector_get(clients,i));
        if(sd > 0)
            FD_SET(sd,&readfds);

        if(sd > max_sd)
            max_sd = sd;
    }
    printf("The max fd is %i\n",max_sd);
    activity = select(max_sd + 1 , &readfds , NULL , NULL , NULL);

    if ((activity < 0) && (errno!=EINTR)) {
        puts("select error");
        exit(EXIT_FAILURE);
    }

    if (FD_ISSET(master_socket, &readfds)){
        new_conn =  nopoll_conn_accept(ctx,listener);
        puts("Waiting for the connection to be ready");
        nopoll_conn_is_ready(conn);
        /*Vector is actually a doubly linked list*/
        vector_push(&clients,new_conn);
        cons++;
    }
    /*TODO: Implement disconnect*/
    for (i = 0; i < cons; i++){
        printf("Checking on user %i\n",i);
        conn = (noPollConn*)vector_get(clients,i);
        sd = nopoll_conn_socket(conn);
        if (FD_ISSET(sd, &readfds)){
            printf("Receiving info from socket no. %d...\n",sd);
            bytes_read = recv(sd,buffer,4000,MSG_DONTWAIT);
            buffer[bytes_read] = '\0';
            printf("Received the msg --> %s\n",buffer);

        }
    }
    memset(buffer,0,3000);
}

只是一个警告,这段代码现在确实进入了无限循环,因为我没有在服务器端实现与客户端的断开连接。

For the client
<pre><code>
            var connection = new WebSocket('ws://127.0.0.1:5959');
            connection.onopen = function(){
                connection.send("TEST");
                alert("Connected");
            }
            connection.onerror = function(error){
               console.log('Error detected: ' + error);
            }
            connection.onmessage = function (event) {
                alert(event.data);
            }

            connection.close();
</code></pre>

也许我错过了一些非常重要的东西?我已经阅读了很多教程,但我似乎无法弄清楚问题所在。任何帮助是极大的赞赏! 在.onopen()函数中调用.send()会报错:

到 'ws://127.0.0.1:5959/?.kl=Y' 的 WebSocket 连接失败:在建立连接之前 WebSocket 已关闭。 更新
错误在服务器端。它可能与我处理连接有关,就好像它在 C 代码中的某些方面是一个套接字一样。

【问题讨论】:

  • “似乎无法保持连接打开。”“也许我错过了一些非常重要的东西?”你为什么打电话.close()?
  • 主要是出于习惯,这只是打开一个连接测试然后发送消息后关闭。我尝试在没有 .close() 的情况下运行它,但它会产生相同的错误。如果我可以问,有理由不这样做吗?我认为一旦不再使用连接,最好总是关闭它。
  • 问题是为什么WebSocket 连接正在关闭,是吗?您在调用.send() 之后的行中明确调用.close()?对cc++ 不太熟悉,虽然listener 定义在noPollConn * listener 之前?
  • 您可能还有其他问题,但我没有看到您正在实施 webSocket 协议的任何地方。 webSocket 连接不是普通的 TCP 连接。它以 HTTP 连接开始,请求升级到 webSocket 协议,然后交换安全密钥,所有数据必须采用 webSocket 数据帧格式。如果服务器不遵循该过程,则客户端将断开连接。详情请见writing webSocket servers on MDN
  • 我会考虑查看 facil.io 或其他 C websocket 库...这应该可以让您专注于您的应用程序和您想要的功能,而不是传输层。

标签: c websocket


【解决方案1】:

如果服务器上没有记录错误,则问题可能会在open 事件发生之前调用.send()。在open 事件处理程序中调用.send()。否则,问题出在服务器上。

const socket = new WebSocket("ws://echo.websocket.org/");

socket.onopen = function(e) {
  socket.send("WebSocket rocks");
  console.log("self.socket event.type:", e.type);
};

socket.onmessage = function(e) {
  console.log(e.data);
};

socket.onerror = function(e) {
  console.log("self.socket error", e);
};

socket.onclose = function(e) {
  console.log("self.socket event.type", e.type);
};

How do I test my WebSocket which is developed in JavaScript

plnkr http://plnkr.co/edit/W8Wgyw0mbxdMkMMe4wg4?p=preview

【讨论】:

  • 它在服务器中。将更新问题以反映这一点!
  • @NathanielBlakely 目前无法为c 代码提供帮助。至少问题被缩小到不是客户端。也许c 编码人员现在可以帮助解决问题。
  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2019-07-19
相关资源
最近更新 更多