つまり、あなたのソリューションは機能しますが、帯域内制御メカニズムをもう少し使用できない理由はわかりません。サーバー上のソケットを 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