gpt4 book ai didi

c - 尝试重新绑定(bind)已关闭的监听套接字失败(EADDRINUSE)?

转载 作者:IT王子 更新时间:2023-10-29 00:57:15 24 4
gpt4 key购买 nike

下面是我的test fixture的精华——

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;
}

在应用程序的正常使用中,监听套接字在应用程序的生命周期内仅绑定(bind)一次,但是测试设置会重复打开和关闭监听套接字。测试用例的第一次迭代工作正常,但后续迭代在 bind() 调用时失败,errno == 98 即 EADDRINUSE。

如何避免这种情况? 理想情况下,该解决方案不需要我有一个单独的代码测试版本,例如在测试时使用 SO_REUSEADDR。

附言- 相同的代码在 Windows 上工作正常,bind() 失败发生在 Linux 上。

最佳答案

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

不幸的是,TCP 的设计目的不是为了测试连续多次关闭和打开同一个 IP/端口,所以如果您仍然想进行这种测试,您将不得不选择毒药。

另见 this answer更深入地探索您的问题。

关于c - 尝试重新绑定(bind)已关闭的监听套接字失败(EADDRINUSE)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51212641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com