0

UDP サーバー アプリケーションに 2 つの機能を実装したいと考えていました。

  1. 任意のクライアントからのデータを継続的に受信するスレッドを作成します。

  2. 特定の時間後にサーバーソケットでデータを継続的に送信し、クライアントからの応答を待機するスレッドを作成します (ハンドシェイクメカニズム)。(これを実装したのは、クライアントがダウンしたときはいつでも、クライアントがデータを送り返さず、サーバーがクライアントがダウンしていることを認識できるようにするためです。)

この目的のために、サーバー側に 2 つのソケットを作成しました。最初のソケットは INADDR_ANY に bind() されます。

2 番目のソケットは、マシンの IP アドレスに bind() されます。

クライアントからのすべての送受信は、最初のソケットで行われます。

クライアントがダウンしていないことを確認するためのハンドシェイク メカニズムは、2 番目のソケットで実行されます。

このアプローチは正しいですか?仕事を進めることができるように、私に知らせてください。前もって感謝します。

4

1 に答える 1

1

つまり、あなたのソリューションは機能しますが、帯域内制御メカニズムをもう少し使用できない理由はわかりません。サーバー上のソケットを 1 つだけにして、これを試してください。

List connections contains pairs (client, lastPacketTime)
Socket is a single UDP Socket

Thread 1 Loop:
    Get new UDP Datagram P From Socket
    If P.client in List: 
        update lastPacketTime
    Else:
        add P.client to list
    If P is not Ping datagram:
        Do other operations on P

Thread 2 Loop:
    For client in List with lastPacket time 3-10 Seconds ago:
        send ping request via Socket
    For client in List with lastPacket time > 10 Seconds ago:
        Mark client as down.
    Sleep for some time

そしてこれはクライアント上で:

Loop:
    If I have data to send:
        Send it!
    Else if I have a ping request in my UDP Socket:
        Send Ping datagram
    Else
        Sleep for some time.

それよりも信頼性の高いハンドシェイクが必要な場合は、UDP のものと一緒にサーバーへの TCP 接続を開くことを検討してください。その後、サーバーは TCP 接続を使用して活性をチェックできます。正直なところ、接続指向の UDP を実行しようとすると、首の後ろの毛が逆立ってしまいます。ping 時間のすべての処理と更新が心配な場合は、3 番目のスレッドを追加できます。

List contains pairs (client, lastPacketTime)
Queue contains Datagrams with time updates.
Socket is a single UDP Socket

Thread 1 Loop:
    Get new UDP Datagram P from Socket
    Add P to Queue
    If P is not Ping datagram:
        Do other operations on P

Thread 2 Loop:
    Get new Datagram P from Queue
    If P.client in List: 
        update lastPacketTime
    Else:
        add P.client to list

Thread 3 Loop:
    For client in List with lastPacket time 3-10 Seconds ago:
        send ping request via Socket
    For client in List with lastPacket time > 10 Seconds ago:
        Mark client as down.
    Sleep for some time
于 2013-03-30T07:04:20.577 に答える