实际上在console.writeline中我从UDP服务器获取所有来自另一个ipaddress的数据。在将那些传输数据写入我的文本文件时,某些数据丢失了,但是没有写入,所以如何将这些数据写入我的文本文件而不会丢失
bool done = false;
private const int listenPort = 9050;
string strDestinationfileName = AppDomain.CurrentDomain.BaseDirectory + "Sample.txt";
UdpClient listener = new UdpClient(listenPort);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);
FileStream fout = new FileStream(strDestinationfileName,
FileMode.OpenOrCreate,
FileAccess.Write, FileShare.ReadWrite);
try
{
while (!done)
{
Console.WriteLine("Waiting for broadcast");
byte[] bytes = listener.Receive(ref groupEP);
fout.Write(bytes, 0, bytes.Length);
System.Threading.Thread.Sleep(100);
Console.WriteLine("Received broadcast from {0} :\n {1}\n",
groupEP.ToString(),
Encoding.ASCII.GetString(bytes, 0, bytes.Length));
}
}
答案 0 :(得分:0)
UDP是基于数据包的不可靠协议。对于你想做的事情,这是最糟糕的选择。
UDP数据包可能按顺序到达,但它们可能根本不会到达,或者无序到达。如果它们太大,它们也可能会被默默地丢弃。
使用TCP:它是一种基于流的协议,其中字节按发送顺序到达,并且可靠地到达。您可以使用.NET的内置Socket
或TCP类。
(如果你确实需要使用UDP,你需要发明自己的数据包编码方案并重试协议以确保数据包到达,并以正确的顺序到达。对于初学者来说这是一项非常复杂的任务,并且基本上TCP为你做什么。只需使用TCP!)
编辑:对于xixonia,因为显然指出一个关键的缺陷是不值得的:你永远不会将done
设置为true
,所以你的循环永远不会退出,你的数据的最后部分永远不会冲到磁盘上。