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
相关产品推荐
相关产品推荐

