C++ 中的 Websocket 服务器发送消息时出错

Posted

技术标签:

【中文标题】C++ 中的 Websocket 服务器发送消息时出错【英文标题】:Websocket Server in C++ Error on sending message 【发布时间】:2016-01-12 18:25:37 【问题描述】:

我一直在开发一个 C++ websocket 服务器,它工作得很好,除了一个我不明白的错误。

问题是我可以接收数据并执行网络浏览器声称的操作,但假设服务器需要发送回一些信息,第一次发送成功,但是当我重复相同的请求(或另一个需要将信息返回给浏览器),我的服务器尝试发送它(显然成功),然后自己再次发送它(我不知道为什么),然后连接关闭。

这是我发送消息的代码:

int CSocketNode::SendMsg(const char opr, const char* cad,int length)
    if (socket_conn == INVALID_SOCKET)
        return -1;
    int pos = 0;
    int result = 0;
    memset(Buffer_out, 0, BUFFER_SIZE);
    if(!webSocket)
        //Build header
        Buffer_out[pos] = 57; //12345 % 256;
        Buffer_out[pos + 1] = 48; //12345 / 256;

        length++;
        if((length / 256) >= 256)
            int divi = length / 256;
            Buffer_out[pos + 2] = length % 256;
            Buffer_out[pos + 3] = divi % 256;
            Buffer_out[pos + 4] = divi / 256;
         else 
            Buffer_out[pos + 2] = length % 256;
            Buffer_out[pos + 3] = 0;
            Buffer_out[pos + 4] = length / 256;
        
        Buffer_out[pos + 5] = opr;
        pos = 5;
        memcpy(Buffer_out + pos + 1, cad, length);
     else 
        Buffer_out[pos++] = 0x81;
        length++;
        if(length <= 125)
            Buffer_out[pos++] = length;
         else if(length <= 65535) 
            Buffer_out[pos++] = 126;
            Buffer_out[pos++] = (length >> 8) & 0xff;
            Buffer_out[pos++] = length & 0xff;

         else 
            Buffer_out[pos++] = 127;
            memset(Buffer_out + pos, 0, 8);

            for (int i = 7; i >= 0; i--)
                Buffer_out[pos++] = (length >> 8*i) & 0xff;
            
        
        Buffer_out[pos++] = opr;
        memcpy(Buffer_out + pos, cad, length);

    
    printf("0: %d, 1: %d, 2: %d, 3: %d, 4: %d. Pos = %d\n", Buffer_out[0], Buffer_out[1], Buffer_out[2], Buffer_out[3], Buffer_out[4], pos);
    printf("%s\n", Buffer_out + pos);
    result = SendBytes(Buffer_out, length + pos);

    return result;


int CSocketNode::SendBytes(char *cad, int length)
    //Send it
    int err = send(socket_conn, cad, length,0);
    if (err == SOCKET_ERROR )
        Error("SendBytes Error");
        return -1;
    
    return 0;

IF 语句的第一部分是针对我的非 Web 浏览器客户端的,它运行良好。

无论数据框大小,小于125或小于65535,结果都是一样的。

也许我错过了什么。也许我必须在消息的 wnd 处添加一个 FIN 消息。但根据 WebSocket 手册,它是消息的第一位,指示它是否是多条消息。

如果你能告诉我它是什么,我将非常感激。

【问题讨论】:

有人调用此代码两次? 我发出了两次请求,但在第二次调用中,套接字发送了两次信息,然后断开连接。我认为断开连接来自浏览器。 【参考方案1】:

自己解决了。由于某种我无法猜测的原因,memcpy 使套接字管道无法正常工作。

所以我使用 for 循环将消息复制到缓冲区。并解决了。

【讨论】:

以上是关于C++ 中的 Websocket 服务器发送消息时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 websocket websocketpp 发送和接收消息?

客户端向 websocket 服务器发送消息时的编码类型是啥?

发送消息时的Python Websocket服务器错误

c++ websocket帧发送导致服务器关闭连接

在 Spring Websocket 上向特定用户发送消息

从 Tornado WebSocket 服务器主动发送消息