首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >试图重新绑定已经关闭的侦听套接字失败(EADDRINUSE)?

试图重新绑定已经关闭的侦听套接字失败(EADDRINUSE)?
EN

Stack Overflow用户
提问于 2018-07-06 14:31:00
回答 1查看 647关注 0票数 3

以下是我测试夹具的精髓-

代码语言:javascript
复制
SetUp()
{
    g_listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    /* localhost is the server */
    bind(g_listen_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
    listen(g_listen_sock, max_connections);
}

testcase()
{
    hdl = accept(g_listen_sock, NULL, NULL);
    -- send()/recv() data on the socket --
}

TearDown()
{
    shutdown(g_listen_sock, SHUT_RDWR);
    close(g_listen_sock);
    g_listen_sock = INVALID_SOCKET;
}

在应用程序的正常使用中,侦听套接字在应用程序的生存期内只绑定一次,但是测试设置会反复打开和关闭侦听套接字。测试用例的第一次迭代运行良好,但随后的迭代在errno == 98 (即EADDRINUSE )的bind()调用中失败。

如何避免这种情况?--理想的解决方案--不要求我有单独的代码测试版本,例如在测试时使用SO_REUSEADDR .

P.S. -相同的代码在Windows上运行良好,bind()故障发生在Linux上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-06 14:40:14

您想要了解的是网络TCP层的内置功能。linux内核将不允许您重新绑定该套接字,因为关闭的套接字将处于TIME_WAIT状态。除了使用SO_REUSEADDR (正如您已经指出的那样),或者为每个测试使用不同的端口(听起来也不像您想要做的那样),没有什么可以避免的。

不幸的是,TCP的设计并不是为了在一行中关闭和打开相同的IP/端口多次进行测试,所以如果您仍然想要进行这种测试,就必须选择您的毒物。

更深入地探索您的问题,请参见this answer

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51212641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档