0

实际上,在 console.writeline 中,我从另一个 ipaddress 发送的 UDPserver 获取所有数据。在将传输的数据写入我的文本文件时,某些数据丢失了它不会写入,所以如何将该数据写入我的文本文件而不丢失

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));
    }
}
4

1 回答 1

0

UDP 是一种基于数据包的不可靠协议。对于您想做的事情,这是最糟糕的选择。

UDP 数据包可能按顺序到达,但也可能根本不到达,或者乱序到达。如果它们太大,它们也可能会被静默丢弃。

使用 TCP:它是一种基于流的协议,其中字节按发送顺序到达,并且将可靠地到达。您可以为此使用 .NET 的内置Socket类或 TCP 类。

(如果你确实需要使用 UDP,你需要发明自己的数据包编码方案和重试协议,以确保数据包到达,并以正确的顺序到达。这对于初学者来说是一项非常复杂的任务,基本上就是 TCP适合你。只需使用 TCP!)

编辑:对于 xixonia,因为显然指出一个关键缺陷是不值得的:您从未设置donetrue,因此您的循环永远不会退出,并且数据的最后部分永远不会刷新到磁盘。

于 2011-10-21T07:27:27.783 回答