【发布时间】:2018-12-15 04:41:17
【问题描述】:
以下是我的测试治具的精华-
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。
附: - 相同的代码在 Windows 上运行良好,bind() 失败发生在 Linux 上。
【问题讨论】:
-
however the test setup repeatedly opens and closes the listening socket.不要那样做。而是停止select()ing 侦听套接字,并停止accept()ing 传入连接。客户端将不得不稍等片刻(而不是获得连接重置)