You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Visual Studio中运行Mongoose C++ HTTP服务器遇mg_open_listen失败

问题描述

在Windows系统的Visual Studio项目中运行Mongoose官方主分支的基础HTTP Server代码时,出现mg_open_listen错误,套接字创建失败。控制台输出如下:

Starting HTTP listener on http://localhost:8000
271275e 1 mongoose.c:4315:mg_open_liste setsockopt(SO_EXCLUSIVEADDRUSE): 10022
271275e 1 mongoose.c:3346:mg_listen     Failed: http://localhost:8000, errno 0

使用的代码如下:

#include <iostream>
#include "mongoose.h"

static const char* s_listen_on = "http://localhost:8000";
static char s_web_root[512] = ".";

static void eventCallback(struct mg_connection* c, int ev, void* ev_data, void* fn_data)
{
    if (ev == MG_EV_HTTP_MSG)
    {
        struct mg_http_message* hm = (struct mg_http_message*)ev_data;

        if (mg_http_match_uri(hm, "/"))
        {
            mg_http_reply(c, 200, "Content-Type: text/plain\n", "Hello, %s\n", "world");
        }

        struct mg_http_serve_opts opts;
        memset(&opts, 0, sizeof(opts));
        opts.root_dir = s_web_root;
        mg_http_serve_dir(c, ev_data, &opts);
    }
    (void)fn_data;
}


int main(int argc, char** argv)
{
    struct mg_mgr mgr;
    mg_mgr_init(&mgr);
    printf("Starting HTTP listener on %s\n", s_listen_on);
    mg_http_listen(&mgr, s_listen_on, eventCallback, NULL);

    for (;;)
    {
        mg_mgr_poll(&mgr, 1000);
    }

    mg_mgr_free(&mgr);
    return 0;
}
问题分析与解决办法

错误码10022对应Windows系统的WSAEINVAL(无效参数),是调用setsockopt(SO_EXCLUSIVEADDRUSE)时触发的,结合errno 0,可从以下几个方向排查解决:

1. 排查端口占用情况

先确认8000端口是否被其他进程占用:

  • 打开命令提示符,执行命令:
    netstat -ano | findstr :8000
    
  • 如果输出结果中有进程ID,可通过任务管理器结束对应进程,或修改代码中s_listen_on的端口号(比如改成8080)。

2. 修改监听地址

localhost可能在系统中优先解析为IPv6地址,导致套接字选项设置冲突。尝试将监听地址改为:

static const char* s_listen_on = "http://0.0.0.0:8000"; // IPv4任意地址
// 或
static const char* s_listen_on = "http://[::]:8000"; // IPv6任意地址

这样可以避免地址解析带来的参数无效问题。

3. 检查Mongoose代码兼容性

主分支代码可能存在Windows平台的临时兼容问题,可尝试:

  • 切换到Mongoose的稳定发布版本,替换项目中的mongoose.c和mongoose.h文件;
  • 查看mongoose.c中mg_open_listen函数里setsockopt的调用逻辑,确认参数是否符合Windows API要求(比如选项值的类型是否正确)。

4. 提升运行权限

Windows下部分套接字操作需要管理员权限:

  • 右键Visual Studio,选择「以管理员身份运行」;
  • 或者编译生成程序后,右键程序选择「以管理员身份运行」。

5. 调整防火墙设置

Windows防火墙可能阻止程序绑定端口,可临时关闭防火墙测试,或在防火墙中添加当前程序的入站/出站规则,允许其使用网络。

内容的提问来源于stack exchange,提问作者Chip Brommer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:27:24