我想在我的udp服务器应用程序上实现两个功能。
创建持续接收来自任何客户端的数据的线程。
创建一个在特定时间段后在服务器套接字上连续发送数据的线程,并等待来自客户端的回复(握手机制)。 (我实现了这一点,以确保无论何时任何客户端发生故障,客户端都不会发回数据,服务器会知道客户端已关闭。)
为此,我在服务器端创建了两个Sokets。 第一个套接字是bind()ed到INADDR_ANY。
第二个套接字是bind()ed到我的机器IP地址。
客户端的所有发送和接收都在第一个套接字上完成。
确保客户端没有关闭的握手机制是在第二个套接字上完成的。
这种做法是否正确? 请告诉我,以便继续我的工作。 提前谢谢。
答案 0 :(得分: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时间,可以添加第三个线程:
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