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 の場合、明らかに重大な欠陥を指摘する価値はありません: に設定さdoneれていtrueないため、ループが終了せず、データの最終部分がディスクにフラッシュされることはありません。

于 2011-10-21T07:27:27.783 に答える