以下是我测试夹具的精髓-
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上。
发布于 2018-07-06 14:40:14
您想要了解的是网络TCP层的内置功能。linux内核将不允许您重新绑定该套接字,因为关闭的套接字将处于TIME_WAIT状态。除了使用SO_REUSEADDR (正如您已经指出的那样),或者为每个测试使用不同的端口(听起来也不像您想要做的那样),没有什么可以避免的。
不幸的是,TCP的设计并不是为了在一行中关闭和打开相同的IP/端口多次进行测试,所以如果您仍然想要进行这种测试,就必须选择您的毒物。
更深入地探索您的问题,请参见this answer。
https://stackoverflow.com/questions/51212641
复制相似问题