【发布时间】:2016-10-31 04:26:41
【问题描述】:
给定(简化的代码):
const timeval timeout = {100, 0};
for(;;)
{
fd_set sockets = {2, {service, controlSocket}};
const auto result = select(0, &sockets, nullptr, nullptr, &timeout);
...
if (result > 0 && FD_ISSET(service, &sockets))
{
auto workerConnection = accept(service, nullptr, nullptr);
WSARecv(workerConnection, ...);
}
}
其中service是处于监听状态的socket,controlSocket是service socket上第一个建立的传入连接,用于与manager通信。
仅当任何先前建立的工作程序连接在远程端正常关闭时,才会发生错误 10022。我强调这段代码几乎一直都能正常工作,除了工作应用程序关闭一个连接,但是,我并不声称关闭远程端的连接会影响这种行为。我刚刚注意到,这个错误发生在远程端关闭连接之后,而服务端报告 WAIT_CLOSE 为已建立的连接之一。我再重复一遍,这段代码可以正常工作,在循环的下一个循环出现错误之后,直到另一个套接字关闭,select 完全没有错误。错误数等于已建立的workerConnections数。
不知道这是否重要我在不使用本地主机的同一台 PC 上测试运行管理器、服务和工作程序应用程序的代码,而是提供 PC 的网络名称来建立连接。与worker服务建立连接后,应用只能通过workerConnection异步接收和发送数据。
问题:由于它根本不影响服务功能,而且我没有任何其他 WSA 错误,是否可以忽略此错误并避免发送有关它的垃圾邮件日志,或者我错过了一些重要的事情并且必须解决问题?我怀疑 WSA 中存在某种问题,因为错误仅在非常特定的情况下发生。我对么?
【问题讨论】: