私の質問は、このコードに適用されます。
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/ポート用に別のソケットとスレッドを作成します。
これは良い解決策、または少なくともその始まりだと思いますが、まだいくつか疑問に思っています.
- 追加されたスレッドを開始するにはどうすればよいですか? すべてのスレッドが終了するのを待つことができず、worker.RunWorkerAsync(); を呼び出します。また。そうすれば、多くの情報が失われる可能性があるので、それは仕方のないことです。
- 「try」はすべてのスレッドで失敗するため、1 つのソケットに対して多数のスレッドが作成されます。どうすれば解決できますか?
また、私が完全に間違った方向に考えている場合は、喜んでお知らせします.
前もって感謝します!