YYDD125 2024-06-09 08:56 采纳率: 20%
浏览 5
已结题

为什么报错,如何解决?


int sendWebSocketMessage(struct lws *wsi, const char *msg) {
    if (!wsi) {
        lwsl_err("Invalid WebSocket instance\n");
        return -1;
    }

    size_t len;
    // 计算消息长度
    if(msg){
        len = strlen(msg);
    } else {
        lwsl_err("Message is null\n");
        return -1;
    }

    if(len > MAX_LEN) {
        lwsl_err("Message exceeds maximum length\n");
        return 1;
    }

    // 发送消息
    int n = lws_write(wsi, (unsigned char *)msg, len, LWS_WRITE_TEXT);

    if (n < 0) {
        lwsl_err("Failed to send WebSocket message\n");
        return -1;
    }

    return 0;
}

检测发现, int n = lws_write(wsi, (unsigned char *)msg, len, LWS_WRITE_TEXT);这行代码造成段错误
#define MAX_LEN 8192

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-09 08:56
    关注

    引自免费微信小程序:皆我百晓生

    在您的C语言代码中,lws_write函数可能会导致段错误,可能的原因有以下几种情况:

    1. wsi指针为空:您已经检查了这个条件,但是确保传递给sendWebSocketMessagewsi实例不是NULL仍然很重要。
    2. msg指针为空:当msg为NULL时,您正确地输出错误信息并返回-1,但确保调用者不会传递空指针也很重要。
    3. msg指向的数据越界:尽管您检查了消息长度不超过MAX_LEN,但是在内存管理上可能存在错误,例如msg所指向的字符串实际长度超过它应该有的长度。

    为了排除这些可能性,您可以尝试以下步骤来调试和修复代码:

    1. 在发送消息之前,打印wsimsg的值,以确认它们是否正常:

      printf("WebSocket instance: %p\n", wsi);
      printf("Message: %s\n", msg);
      
    2. 确保调用者不会传递空的msg。可以考虑在函数签名中添加一个额外的参数来检查msg是否为空,并且在调用时总是提供它。

    修改后的函数定义:

    int sendWebSocketMessage(struct lws *wsi, const char *msg, bool has_msg) {
        ...
    }
    

    调用示例:

    sendWebSocketMessage(wsi, "Hello, World!", true);
    
    1. 检查msg的实际长度,即使它看起来是正确的,也有可能因为内存溢出而损坏。在计算长度前,检查msg是否指向有效的内存区域:

      if (msg && msg[0] == '\0') {
          lwsl_err("Empty message\n");
          return -1;
      }
      
    2. 如果以上步骤都无法找到问题,那么可能是lws_write函数本身的问题,或者是与之相关的库存在问题。在这种情况下,您可能需要查看lws_write函数的文档,或者查找相关社区的讨论,看看是否有其他人遇到过类似的问题。

    下面是经过调整的代码片段:

    #include <stdio.h> // 添加此行以便使用printf
    
    int sendWebSocketMessage(struct lws *wsi, const char *msg, bool has_msg) {
        if (!wsi) {
            lwsl_err("Invalid WebSocket instance\n");
            return -1;
        }
    
        if (!has_msg || !msg) {
            lwsl_err("Message is null or missing\n");
            return -1;
        }
    
        if (msg[0] == '\0') {
            lwsl_err("Empty message\n");
            return -1;
        }
    
        size_t len = strlen(msg);
    
        if(len > MAX_LEN) {
            lwsl_err("Message exceeds maximum length\n");
            return 1;
        }
    
        printf("WebSocket instance: %p\n", wsi);
        printf("Message: %s\n", msg);
    
        int n = lws_write(wsi, (unsigned char *)msg, len, LWS_WRITE_TEXT);
    
        if (n < 0) {
            lwsl_err("Failed to send WebSocket message\n");
            return -1;
        }
    
        return 0;
    }
    

    现在,您可以根据这些更改重新编译并运行程序,观察输出以确定问题所在。如果问题仍然存在,可能需要更深入地研究lws_write函数的行为或者联系库的开发者或社区寻求帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月9日
  • 创建了问题 6月9日