gpt4 book ai didi

C# TCPClient/Socket 编写不抛出异常

转载 作者:可可西里 更新时间:2023-11-01 02:34:51 30 4
gpt4 key购买 nike

我尝试通过 tcp 连接连接到许多打印机。我正在尝试验证我的 TcpClient 是否仍处于连接状态以更新 GUI。我正在尝试写入套接字以确保它仍然连接。即使拔下电缆,我也不异常(exception) 我尝试了这里的所有建议 MSDN_Fourm

我在尝试检查打印机状态后收到了预期的异常

伪代码client 是之前连接过的TCPClient

private bool FuntionPsudo(){
try{
if(client.Connected){
byte[] buf = new byte[1];
client.Client.Send(buf, 0,0);
client.GetStream().Write(buf,0,0);
if(client.Client.Receive(buf,SocketFlags.Peek)==0)
return false;
return true;
}
}
catch(Exception){
return false;
}

return false;
}

FuntionPsudo 返回:true

拔掉数据线

FuntionPsudo 返回:true

FuntionPsudo 返回:true

检查打印机状态

FuntionPsudo 返回:false

在此先感谢您就为什么会发生这种情况和/或如何解决它提供任何帮助

最佳答案

在几次失败的尝试之后,我意识到“拔下电缆”类型的连接检测并不是那么容易。同时我发现有一些技巧可以用来检查服务器是否关闭了连接,所有这些都不需要发送心跳类型的消息。

这是我想出的,我可以说它在大多数情况下都能正常工作(尤其是在电缆断开连接的情况下,不容易弄清楚连接是否仍然有效)

static class SocketUtils
{
public static bool IsConnected(this Socket socket)
{
return IsSocketConnected(socket) && IsNetworkConnected(socket);
}

public static void KeepAlive(this Socket socket, int pollSeconds)
{
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
SetIOControlKeepAlive(socket, (uint)(pollSeconds * 1000), 1);
}

static bool IsNetworkConnected(this Socket socket)
{
try
{
return socket.Send(new byte[0]) == 0;
}
catch (SocketException) { return false; }
}

static bool IsSocketConnected(this Socket socket)
{
try
{
return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
}
catch (SocketException) { return false; }
}

static void SetIOControlKeepAlive(Socket socket, uint time, uint interval)
{
var sizeOfUint = Marshal.SizeOf(time);
var inOptionValues = new byte[sizeOfUint * 3];
BitConverter.GetBytes((uint)(time == 0 ? 0UL : 1UL)).CopyTo(inOptionValues, 0);
BitConverter.GetBytes(time).CopyTo(inOptionValues, sizeOfUint);
BitConverter.GetBytes(interval).CopyTo(inOptionValues, sizeOfUint * 2);

socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
}
}

这里是你如何使用它:

var tcpClient = new TcpClient();

tcpClient.Connect("192.168.2.20", 3000);

// set this to a low value to detect cable disconnects early
tcpClient.Client.KeepAlive(30); // 30 seconds

Console.WriteLine("Connected..");
while (true)
{
Thread.Sleep(500);
Console.WriteLine(tcpClient.Client.IsConnected());
}

我必须补充一点,我无耻地从 Samuel's answer about checking client disconnects 复制了一些代码和 Greg Dean's answer about setting keep-alive on the socket , 所以他们也应该有一些功劳 ;)

关于C# TCPClient/Socket 编写不抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24538398/

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