C# Sock在重复使用后显示不一致/不可能的结果
嘿,大家好,我试图确定一些服务器的状态随着时间的推移。 这是我的密码:C# Sock在重复使用后显示不一致/不可能的结果,c#,.net,sockets,tcp,C#,.net,Sockets,Tcp,嘿,大家好,我试图确定一些服务器的状态随着时间的推移。 这是我的密码: static void Main(string[] args) { byte[] readstream = new byte[100]; byte[] sendstream = Encoding.ASCII.GetBytes("PLAYER_JOINED"); string[] IPs = new string[] { "24.15.169.211", "69.198.
static void Main(string[] args)
{
byte[] readstream = new byte[100];
byte[] sendstream = Encoding.ASCII.GetBytes("PLAYER_JOINED");
string[] IPs = new string[] { "24.15.169.211", "69.198.255.121", "219.79.244.225" };
string[] Name = new string[10];
string[] Port = new string[10];
int timeout = 5000;
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.ReceiveTimeout = timeout;
while (true)
{
int i = 0;
foreach (string str in IPs)
{
IPAddress address = IPAddress.Parse(str);
IPEndPoint CheckingServer = new IPEndPoint(address, 8190);
try
{
s.Connect(CheckingServer);
s.Send(sendstream);
s.Receive(readstream);
Console.WriteLine(Encoding.ASCII.GetString(readstream));
Console.WriteLine("{0}: Server Up", IPs[i]);
}
catch
{
Console.WriteLine("{0}: NO SUCH SERVER", IPs[i]);
}
i++;
}
Thread.Sleep(1000);
}
}
当我运行这段代码时,它显示24.15.169.211在第一次运行时处于运行状态,但在随后的测试中恢复为没有这样的服务器。为什么?因为您正在尝试连接已连接的套接字。打印异常,您将看到出现了什么问题。将catch子句更改为
}catch (Exception ex) {
Console.WriteLine(ex);
}
下面是一个稍微修改的版本,它使用了原始套接字,而不是原始套接字:
var ipsToCheck = new[] { "24.15.169.211", "69.198.255.121", "219.79.244.225" };
while (true)
{
foreach (var ip in ipsToCheck)
{
using (var tcpClient = new TcpClient(AddressFamily.InterNetwork))
{
tcpClient.ReceiveTimeout = 5000;
try
{
tcpClient.Connect(IPAddress.Parse(ip), 8190);
using (var stream = tcpClient.GetStream())
{
var writer = new StreamWriter(stream);
var reader = new StreamReader(stream);
writer.Write("PLAYER_JOINED");
var buffer = new char[100];
reader.Read(buffer, 0, buffer.Length);
Console.WriteLine(buffer);
Console.WriteLine("{0}: Server Up", ip);
}
}
catch (Exception ex)
{
Console.WriteLine("Error connecting to {0}: {1}", ip, ex.Message);
}
}
}
Thread.Sleep(1000);
}
这不起作用,我猜这段代码的问题在于这些服务器的通信方式与它们发送和接收数据的方式不兼容。当我在I++之前添加s.Disconnect(true)时,它仍然不起作用。有什么建议吗?