我遇到了停止socket.connect()函数的问题。 有时我的本地计算机和远程计算机之间的物理链接可能很好,但由于某种原因,无法访问远程端点,可能是防火墙或远程计算机上的端口已关闭。在这种情况下,socket.connection()函数将被卡在那里并等待无限长时间......即使防火墙稍后被禁用,该函数仍将永远停留在那里。
所以当我遇到上述情况时,我试图找到一种方法来阻止socket.connect()。
问题是我正在使用.net微框架,其中我没有超时机制或任务或socket.beginconnect();
我正在尝试使socket.connect()本身成为一个线程,如果(!thread.join(2000))在2秒后尝试中止()它。但是,我不太明白abort()函数,我听说过这是一种不明智的方法,而且事后并不起作用。
现在我不知道该怎么办?有人可以帮忙吗?很多
main function
{
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//Set up socket
remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP_add), 30000);
m_socket.Connect(remoteEndPoint);
myThread.Start();
if (!myThread.Join(2000))
{
Debug.Print(myThread.ThreadState.ToString());
myThread.abort();
}
}
private static void socket_connect()
{
m_socket.Connect(remoteEndPoint);//Connect to remote device
}
答案 0 :(得分:1)
建议忙碌等待Connect
呼叫超时。我非常不同意a)哲学和b)WinSock没有提供更好的方法来解决这个常见问题的主张。
这是一个更好的解决方案:
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
socket.Close();
});
try
{
socket.Connect("192.168.2.123", 1234);
}
catch (SocketException sex)
{
if (sex.ErrorCode == 10038)
Console.WriteLine("Timeout");
else
throw;
}
}
您自己检测到超时并关闭套接字。该程序运行大约需要1秒,因此超时机制有效。
请注意,上面的代码是演示代码,应该使用计时器,并且不需要比赛。
忙碌等待有什么不对?
答案 1 :(得分:0)
如果您的框架支持非阻塞连接,您可以尝试使用此代码。我在Win7中为.net 4写了这个。
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("Trying to connect");
socket.Blocking = false;
try
{
socket.Connect("8.8.8.8", 5050);
}
catch (Exception ex)
{
if (ex is SocketException) && ((SocketException)ex).ErrorCode == 10035) // There is a socket problem and this problem is because of being in non-blocking mode? Then this is just a warning
{
// Waiting for connection
int time = 0;
while (time < 1000) // If it was lower than 1 second
{
// Do what you want
if (socket.Connected) // If connected then break
break;
System.Threading.Thread.Sleep(50); // Wait 50milisec
time += 50;
}
}
else
{
Console.WriteLine("Failed");
}
}
if (!socket.Connected)
Console.WriteLine("Aborted");
else
Console.WriteLine("Connected");