0

私の質問は、このコードに適用されます。

using DSemulator;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Stuff
{
public class interfaceServer
{
        int portNumber = 8000;
        IPEndPoint ipep, iclient;
        UdpClient clientUdp;
        BackgroundWorker worker = new BackgroundWorker();

        List<UdpClient> clients = new List<UdpClient>();

        public interfaceServer()
        {
                ipep = new IPEndPoint(IPAdress.Any, portNumber);
                iclient = new IPEndPoint(IPAddress.Any, 0);

                clientUdp = new UdpClient();
                clientUdp.ExclusiveAddressUse = false;
                clientUdp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

                clientUdp.Client.Bind(ipep);

                worker.DoWork += delegate { worker_DoWork(clientUdp, iclient); };
                worker.RunWorkerAsync();
        }

        void worker_DoWork(UdpClient udpClient, IPEndPoint remoteEndpoint)
        {
                bool read = true;
                while (read)
                {
                        Byte[] data_rec = new Byte[128];
                        try
                        {
                                data_rec = udpClient.Receive(ref remoteEndpoint);
                        }
                        catch (SocketException)
                        {
                                IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
                                UdpClient tempClient = new UdpClient();
                                tempClient.ExclusiveAddressUse = false;
                                tempClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                                tempClient.Client.Bind(endpoint);

                                worker.DoWork += delegate { worker_DoWork(tempClient, endpoint); };
                        }

                        //do interesting stuffzz
                        //the UdpClient and remoteEndpoint need to be passed to objects of another class.
                        //these objects handle sending data back
                }
        }
}
}

企業秘密のため、コード全体を表示することはできませんが、ここに問題があります。

Udpパッケージを受け取る必要があると単純に言ったプログラムがあります。パッケージは、任意の IP アドレスおよび任意のポート番号から送信できます。また、どれだけの接続があるかを言う方法もありません。これらの接続はすべて同時に処理する必要があります (私たち人間にとっては同時に)、1 つのソケットが何かを受信して​​から別の受信に移るまで待つことができないため、スレッドを実装しました。メッセージは単一のポート (この場合は 8000) で受信されます。

私が作成したコードでは、メッセージを受信するための try-catch ステートメントを作成しました。別の IP/ポートから受信したメッセージがある場合、'try' 部分は失敗するため、キャッチで、この別の IP/ポート用に別のソケットとスレッドを作成します。

これは良い解決策、または少なくともその始まりだと思いますが、まだいくつか疑問に思っています.

  1. 追加されたスレッドを開始するにはどうすればよいですか? すべてのスレッドが終了するのを待つことができず、worker.RunWorkerAsync(); を呼び出します。また。そうすれば、多くの情報が失われる可能性があるので、それは仕方のないことです。
  2. 「try」はすべてのスレッドで失敗するため、1 つのソケットに対して多数のスレッドが作成されます。どうすれば解決できますか?

また、私が完全に間違った方向に考えている場合は、喜んでお知らせします.

前もって感謝します!

4

0 に答える 0