【发布时间】:2011-08-08 03:16:46
【问题描述】:
我正在通过套接字连接到 C# 中的远程服务器并发送数据,断开连接后我尝试通过创建新套接字并重新初始化它来重新建立连接。
当我通过拔出以太网电缆并在几分钟后重新连接它进行测试时,这对我有用,但偶尔(可能每隔几个小时)我在连接时遇到两个异常之一并且无法重新连接......
System.Net.Sockets.SocketException:已建立的连接被主机中的软件中止
.......
System.Net.Sockets.SocketException: 现有连接被远程主机强行关闭
如果我重新启动应用程序,一切都会再次正常,所以我很好奇为什么创建新套接字不起作用。我是否错过了某个地方的初始化?有任何想法吗?我每次都用同样的方法连接:
public static bool OpenConnection(string siteName)
{
bool success;
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(serverIp), Convert.ToInt16(serverRemotePort));
try
{
client = null;
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("Try to connect to the server ..." + ip.Address.ToString());
client.Connect(ip);
Console.WriteLine("Connection established");
//Send the nameSite first
string nameSite = EncryptString(siteName, pwd, initVector) + "*";
byte[] dataSite = new byte[100];
dataSite = Encoding.ASCII.GetBytes(nameSite);
client.Send(dataSite, dataSite.Length, SocketFlags.None);
Console.WriteLine("NameSite send");
success = true;
}
catch (SocketException e)
{
success = false;
Console.WriteLine("Unable to connect to the server : " + e.StackTrace);
}
return success;
}
我尝试在 catch 中重新连接,计数随着 while 循环的每次迭代而递增。
if (count % 20 == 0)
{
try
{
if (OpenConnection(siteName))
connected = true;
EventLog.WriteEntry("Connection re-established.");
}
catch (SocketException socketEx)
{
Console.WriteLine("Reconnection failed. Storing data locally. \n\n " + socketEx);
EventLog.WriteEntry("Reconnection failed. Storing data locally. \n\n " + socketEx);
}
}
构造函数只是简单地初始化 IP 和端口号。为什么某些类型的断开连接会阻止我在不重新启动的情况下重新连接,有什么想法吗?
【问题讨论】:
-
每次连接尝试之间等待多长时间?
-
@jgauffin - 这取决于保存到数据库的频率(参数),目前每次迭代大约为 1 秒,所以如果我将其设置为尝试像上面那样每 20 次迭代重新连接一次,然后大约 20 秒。我是否需要使用 Socket.Close() 方法进行清理?
标签: c# sockets connection