C# 如何更改BeginConnect的超时
考虑以下计划:C# 如何更改BeginConnect的超时,c#,sockets,timeout,C#,Sockets,Timeout,考虑以下计划: using System; using System.Diagnostics; using System.Net.Sockets; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Socket sock = new Socket( AddressFamily.InterNetwork, SocketType.Stream, Pr
using System;
using System.Diagnostics;
using System.Net.Sockets;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Socket sock = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
try
{
Stopwatch watch = new Stopwatch();
watch.Start();
IAsyncResult res = sock.BeginConnect("localhost", 7000, null, null);
res.AsyncWaitHandle.WaitOne( 5000 ); // 5 sec timeout
watch.Stop();
Console.WriteLine("Elapsed ms: " + watch.ElapsedMilliseconds);
if (!sock.Connected) {
sock.Close();
Console.WriteLine("Failed to connect server.");
}
}
catch (System.Exception ex) {
Console.WriteLine(ex.Message);
}
}
}
}
控制台输出:
Elapsed ms: 1014
Failed to connect server.
我希望BeginConnect
尝试建立连接大约5秒钟,而等待总是在1秒钟后返回。
为什么?套接字不会自行尝试重新建立连接。到目前为止,如果套接字仍处于连接阶段,那么您所做的将意味着您将关闭该套接字。但是,如果服务器主动拒绝连接,例如,或者类似的事情,那么套接字很快就会知道。要检查是否需要从
IAsyncResult
中获取错误,可以在那里查看失败的原因。如果要主动尝试重新连接,则必须实现自己的逻辑,该逻辑将检查结果,并在需要时在一段时间内创建一个新套接字,然后再次尝试连接。套接字不会尝试自行重新建立连接。到目前为止,如果套接字仍处于连接阶段,那么您所做的将意味着您将关闭该套接字。但是,如果服务器主动拒绝连接,例如,或者类似的事情,那么套接字很快就会知道。要检查是否需要从IAsyncResult
中获取错误,可以在那里查看失败的原因。如果您想主动尝试重新连接,那么您必须实现自己的逻辑,该逻辑将检查结果,并在需要时在一段时间内创建一个新套接字,然后再次尝试连接。请查看此[thread][1][1]:请查看此[thread][1][1]:重点是没有这样的服务器,也就是说,我能想到的唯一错误就是超时。我想知道如何增加这个超时值。您是尝试了ConnectAsync还是只是连接?在调用connect时,是否在已完成事件中出现任何错误或异常?如果调用ConnectAsync,可以在回调中检查SocketAsyncEventArgs.SocketError。Connect产生:已用ms:1012无法建立连接,因为目标计算机主动拒绝了它127.0.0.1:7000
,因此操作在相同的时间后失败。似乎操作系统正在主动拒绝连接,因为还没有打开这样的端口。是否有办法配置套接字,使其在建立连接之前永远重试?(使用普通OS/socket函数,不使用线程)。因此,您实际上遇到了我描述的问题(目标机器主动拒绝)。这意味着解决方案也是我所描述的。恐怕没有内在的方法来实现你想要的。你必须用try-catch包装你的方法(顺便说一句,我想你没有异常,因为你没有调用EndConnect),然后创建一个新的套接字并尝试再次连接,并根据需要添加逻辑来检查次数或超时。顺便说一句,我想最好不要尝试重新连接。若您从套接字层得到一个异常,那个么超时不太可能有帮助。如果第一次尝试失败,而随后的一次尝试失败,我建议您尝试重新连接3次,例如。如果你需要永远重试(我把它放在我的系统上),那么你需要用reconnect做一个while true循环,只是不要忘记在尝试重新连接之前引入超时。重点是没有这样的服务器,也就是说,我能想到的唯一错误就是超时。我想知道如何增加这个超时值。您是尝试了ConnectAsync还是只是连接?在调用connect时,是否在已完成事件中出现任何错误或异常?如果调用ConnectAsync,可以在回调中检查SocketAsyncEventArgs.SocketError。Connect产生:已用ms:1012无法建立连接,因为目标计算机主动拒绝了它127.0.0.1:7000
,因此操作在相同的时间后失败。似乎操作系统正在主动拒绝连接,因为还没有打开这样的端口。是否有办法配置套接字,使其在建立连接之前永远重试?(使用普通OS/socket函数,不使用线程)。因此,您实际上遇到了我描述的问题(目标机器主动拒绝)。这意味着解决方案也是我所描述的。恐怕没有内在的方法来实现你想要的。你必须用try-catch包装你的方法(顺便说一句,我想你没有异常,因为你没有调用EndConnect),然后创建一个新的套接字并尝试再次连接,并根据需要添加逻辑来检查次数或超时。顺便说一句,我想最好不要尝试重新连接。若您从套接字层得到一个异常,那个么超时不太可能有帮助。如果第一次尝试失败,而随后的一次尝试失败,我建议您尝试重新连接3次,例如。如果您需要永远重试(我的系统就是这样),那么您需要使用reconnect执行一个while true循环,只是在尝试重新连接之前不要忘记引入超时。