c# – NetworkStream.Read的替代方案,表示远程主机已关闭连接?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – NetworkStream.Read的替代方案,表示远程主机已关闭连接?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1397字,纯文字阅读大概需要2分钟。
内容图文
![c# – NetworkStream.Read的替代方案,表示远程主机已关闭连接?](/upload/InfoBanner/zyjiaocheng/825/1e7c7ee5a6dc486699360bbb7852f26a.jpg)
关于使用TcpClient类处理TCP / IP连接,是否有替代方法可以检查远程主机是否已关闭连接而不是等待NetworkStream.Read方法返回0?
解决方法:
您可以在TcpClient.Client上使用IOControlCode.KeepAliveValues来保证至少在指定的时间间隔内进行保持活动检查,然后检查TcpClient.Client.Connected属性.
如何使用它的一个例子:
struct tcp_keepalive
{
public int OnOff;
public int KeepAliveTime;
public int KeepAliveInterval;
public unsafe byte[] Buffer
{
get
{
var buf = new byte[sizeof(tcp_keepalive)];
fixed(void* p = &this) Marshal.Copy(new IntPtr(p), buf, 0, buf.Length);
return buf;
}
}
};
static void KeepAliveTest()
{
using(var c = new TcpClient())
{
c.Connect("www.google.com", 80);
var s = c.Client;
var ka = new tcp_keepalive();
ka.OnOff = 1; // enable
ka.KeepAliveTime = 1000 * 60; // 60 seconds of inactivity allowed
ka.KeepAliveInterval = 1000; // 1 second interval on keep-alive checks (default)
s.IOControl(IOControlCode.KeepAliveValues, ka.Buffer, null);
var ns = c.GetStream();
Console.WriteLine("Connected to " + s.RemoteEndPoint);
while(true)
{
SocketError se;
s.Blocking = false;
s.Receive(new byte[0], 0, 0, SocketFlags.Peek, out se);
s.Blocking = true;
if(!s.Connected)
{
// se==SocketError.ConnectionReset||SocketError.NetworkReset if the connection was closed because of a keep-alive check
Console.WriteLine("Socket disconnected: " + se);
break;
}
// do other stuff
if(ns.DataAvailable) ns.Read(new byte[100], 0, 100);
else Thread.Sleep(10);
}
}
}
内容总结
以上是互联网集市为您收集整理的c# – NetworkStream.Read的替代方案,表示远程主机已关闭连接?全部内容,希望文章能够帮你解决c# – NetworkStream.Read的替代方案,表示远程主机已关闭连接?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。