【问题标题】:C# .Net Socket Keep Alive time?C# .Net Socket 保持活动时间?
【发布时间】:2011-09-23 23:50:59
【问题描述】:

新手问题在这里..只是想在这里确定..

不是一个 HTTP Keep-Alive 问题。

有没有办法确保套接字在一定时间后关闭()。

为什么我要问这个,因为如果我立即关闭套接字.. 客户端可能不会收到数据包以指示密码错误等..

Socket 内部是否有类似内置命令的超时?

我试图避免建立一个计时器或事件来关闭它并考虑替代解决方案

【问题讨论】:

    标签: c# .net visual-studio sockets timeout


    【解决方案1】:

    我自己没试过,但是有LingerOption

    看看Socket.LingerState Property

    该属性控制长度 面向连接的时间 连接将保持打开后 当数据仍然存在时调用 Close 发送。当您调用方法发送时 数据到对等点,该数据被放置在 传出网络缓冲区。这 属性可用于确保 该数据被发送到远程主机 在 Close 方法删除之前 连接。

    【讨论】:

    • 效果不太好,也许我没有正确使用它? socket.LingerState = new LingerOption(true, 3); socket.Send(new byte[] { 0 }); socket.Close(); 在 10 次中仅发送 1 次零字节... ehhhh 你知道我会让它们保持打开状态,我认为它们迟早会关闭
    • 尝试设置socket.NoDelay = true 并增加3 让我们说30
    • 没有变化。 socket.LingerState = new LingerOption(true, 30); socket.NoDelay = true; 我猜这意味着放置在传出网络缓冲区上的数据将在那里停留一段时间。甚至可能一分钟.. 等待我的客户甚至在 3-5 秒内超时。
    • @SSpoke - 你能展示你的代码吗?如果不了解您在做什么,这有点难以分辨。您可以制作一个简单的服务器和客户端应用程序并将代码粘贴到您的问题中吗?这将有助于提供更好的答案。
    • 这可能比实际问题更难哈哈.. 好耗时。客户端不是用 C# 编写的,我什至没有源代码。好吧,我正在尝试防止僵尸连接。当用户名/密码无效时,客户端在断开连接时工作良好。但有时假客户端可能会连接,例如 telnet 等。它会一直挂在那里,直到我关闭 telnet。我想设置一个超时即使 telnet 已打开并完全连接,它也会自动关闭。我想让 telnet 知道是的,您已断开连接。 setsocketopt.
    【解决方案2】:

    我假设您在谈论 TCP 协议。
    如果您想确保客户端已收到某些内容,则客户端需要为最后收到的消息(例如错误密码)发送响应,并且服务器在收到确认后或出现读取超时时关闭连接。

    【讨论】:

    • 客户端不发送任何响应我无权修改客户端。老实说,我想要的只是避免假客户端假装是 telnet 等客户端的死锁连接,我还想让这些假客户端知道他们为什么断开连接等。你知道我会留下什么......我知道C++ 你可以用setsocketopt 做到这一点
    • msdn.microsoft.com/en-us/library/e160993d.aspx - 访问套接字选项的 C# 方式。
    猜你喜欢
    • 2016-11-26
    • 2012-04-14
    • 2012-05-20
    • 1970-01-01
    • 2016-09-12
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多