gpt4 book ai didi

.net - 如果您从不调用 Socket.EndConnect 会发生什么?

转载 作者:行者123 更新时间:2023-12-04 15:37:19 25 4
gpt4 key购买 nike

使用 .Net 4.0。我有一些代码尝试使用 BeginConnect 和回调打开连接。如果用户试图在接下来的几分钟内停止编程,我会尝试断开连接。那时我设置了一个标志来指示是否需要从回调中调用 EndConnect。如果该标志设置为 false,我将跳过 EndConnect,因为无论如何套接字已被丢弃。

此时用户可以立即再次尝试连接。我没有看到这种情况发生,但以防万一。现在创建了一个新套接字并再次调用 BeginConnect。

从不调用 EndConnect 方法可以吗?

最佳答案

在所有情况下(除了一个[1])调用BeginZZZ需要匹配的EndZZZZ .

否则非托管资源将被泄露,很可能是操作 ZZZZ无法正确完成——可能会破坏 ZZZZ 的进一步使用之后。

套接字对滥用非常健壮(IP 堆栈必须处理网络故障和乱序的数据包),但这并不是一个好的实践。

如果您使用标志来跟踪“关机”,最好调用 EndConnect 然后立即关闭套接字。毕竟连接本身可能会失败,并且不需要断开连接( EndConnect 会抛出 SocketException )。就像是:

mySocket.BeginConnect(address, port, ia => {
if (shuttingDown) {
try {
mySocket.EndConnect(ia);
mySocket.BeginDisconnect(false, iaa = {
try {
mySocket.EndDisconnect(iaa);
} catch (Exception) { /* Ignore */ }
}, null);
} catch (SocketException) { /* Ignore */ }
} else {
// Normal connection handling
}
}, null);

还使用异步断开连接来避免阻塞。

[1] 异常(exception)是 Control.BeginInvoke 在 WinForms 中,明确记录了异常。

关于.net - 如果您从不调用 Socket.EndConnect 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711769/

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