我正試圖捕獲特定端口上的所有傳入事件。它工作正常,但我認爲,我的Socket被阻塞5秒,而stream.Read()
正在執行。 stream.Read()
忙時,如果有包裹進入,會發生什麼情況?我怎麼能避免可能的數據丟失?C#在沒有busyTimes的情況下在tcp網絡中偵聽?
public static void Main(string[] args)
{
System.Console.WriteLine("Testprogramm Connection\n");
//ThreadListener tl = new ThreadListener();
DateTime startTime3 = DateTime.Now;
DateTime startTime4 = DateTime.Now;
TimeSpan duration3;
TimeSpan duration4;
while (true)
{
DataPackage dp = Connection.readEvent(4002, 3000);
DateTime EndZeit = DateTime.Now;
if (dp.Ip.Equals("192.168.101.3"))
{
duration3 = EndZeit - startTime3;
System.Console.WriteLine("Duration to last receive: " + duration3);
startTime3 = DateTime.Now;
}
if (dp.Ip.Equals("192.168.101.4"))
{
duration4 = EndZeit - startTime4;
System.Console.WriteLine("Duration to last receive: " + duration4);
startTime4 = DateTime.Now;
}
System.Console.WriteLine();
}
}
...Connection.cs
public static DataPackage readEvent(int port, int size)
{
DataPackage dp = new DataPackage();
byte[] bytes = new byte[size];
String ip_client = "";
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[1];
try
{
System.Console.Write("Wait...:");
listener = new TcpListener(ipAddress, port);
listener.Start();
tcpClient = listener.AcceptTcpClient();
tcpClient.NoDelay = true;
tcpClient.Client.NoDelay = true;
ip_client = tcpClient.Client.RemoteEndPoint.ToString();
stream = tcpClient.GetStream();
DateTime startTime = DateTime.Now;
stream.Read(bytes, 0, bytes.Length);
DateTime endTime = DateTime.Now;
stream.Close();
tcpClient.Close();
listener.Stop();
dp.Data = bytes;
dp.setIP(ip_client);
System.Console.Write("...received from " + ip_client + " busy:");
TimeSpan duration = endTime - startTime;
System.Console.WriteLine(duration.Seconds + "s");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
closeAllConnections();
return null;
}
return dp;
}
你能舉個例子嗎? –
我曾嘗試儘可能提前啓動。但沒有注意到一些改進。我曾考慮過線程,但我認爲使用套接字多次或連接到同一端口的多個套接字可能會有問題... –
我添加了一個可能遵循的示例。我在VS中很快就把它掀起來了,所以它應該可以編譯,但它沒有完全測試。你應該從中得到想法。 –