【发布时间】:2016-01-02 19:53:13
【问题描述】:
我目前正在进行一个个人项目以用于学习目的。我想通过 UDP 建立连接,用于游戏等应用程序。发送的每个数据报都有一个特定的标头,指示它属于哪个“逻辑”通道 - 例如,通道 0 就像 UDP 具有额外的标头开销,而通道 1 使用更多标头来带来一些额外的可靠性。通道的目标是“自动”将消息分成逻辑组,最多达到特定数量。
在我当前的代码中,在处理发送和接收的单独线程中有一个简单的循环:
// This is pseudo code
public void Tick() {
if(Socket.Poll) {
do {
ReadMessage();
} while(Socket.Available > 0)
}
SendQueuedOutgoingMessages();
}
虽然这适用于理想世界,但我感觉当传入或传出消息过多时,此逻辑会失败。是否可以使用同一个套接字同时发送和接收消息(即发送和接收是异步的或在不同的线程中)?即使有可能,如果我只是使用两个或多个 UDP 套接字(或混合 TCP 和 UDP 套接字,如果我需要可靠性),并特别考虑可维护性会更好吗?
我能想到的最直接的替代方案是使用调度算法通过队列大小或其他因素来控制要读取和发送的消息数量,但在这种情况下感觉很差且不灵活。
编辑:添加有关代码的更多信息。
如果 Tick() 方法立即返回,则设置为每秒调用特定次数。例如,如果不存在新的输入或输出消息,则每秒 30 次,如果需要一些时间来发送或接收数据,则更少。我使用了阻塞 ReceiveFrom 和 SendTo 方法来避免忙等待或 Sleep(0) 等调用。
虽然我会立即处理传入的消息,但我使用传出消息队列来帮助实现通道的想法 - 每个通道都有自己的优先级,直到“无优先级”,随着时间的推移在平稳和忙碌的时刻影响其带宽份额。
【问题讨论】: