如何在Delphi中增加TCP数据包的优先级?

时间:2012-03-22 19:48:36

标签: delphi winapi tcp

我有一个服务器应用程序从客户端接收一些特殊的TCP数据包,需要通过向客户端发送高级别的ACK来尽快做出反应(TCP ACK不能满足我的需求)。 / p>

但是,这个服务器实际上是网络密集型的,有时数据包发送时间太长(例如本地网络中的200ms,当一个简单的服务器应用程序可以在不到1ms的时间内发送它时)。

有没有办法在Delphi中使用高优先级标记或类似标记来标记此数据包?或者使用Win32 API?

提前致谢。

修改

感谢目前为止的所有答案。我会添加一些细节。我的产品具有以下设置:有几种设备基于具有WIFI锥度的车辆构建。当他们到达车库时,这些设备连接到我的服务器并开始传输数据。

由于硬件限制,我实现了一个高级别的ACK,使设备知道最后一个数据包成功到达(请不要争论这个 - 即使我得到了正确的TCP ACK,数据也可能被破坏) 。但是,如果我使用与远程数据库通信的服务器软件,发出此ACK,我会得到很长的延迟(> 200ms)。如果我使用专用软件来完成此任务,我会得到小的延迟(<1ms)。所以,我想象我是否可以告诉Windows首先发送这些特殊数据包,因为似乎对我来说这个数据包正在被延迟,所以数据库可以被传递。

这是我的问题背后的动机。

编辑2

根据要求:这是旧版软件,我使用的是旧版 dclsockets140.bpl 软件包和 Delphi 2010(14.0.3593.25826)

2 个答案:

答案 0 :(得分:2)

IMO很难实现这一点。涉及很多设备和软件。首先,如果你在两个不同的操作系统之间进行通信,你会遇到延迟。第二,软硬防火墙,防病毒软件,一切都在过滤/延迟你的软件包。

你也可以尝试“破解”。系统(这涉及到关于如何打包/发送帧/流,流控制,拥塞等的一些非常好的知识),或者通过使用某些工具(如http://half-open.com/或其他工具)从代码中改变它。

答案 1 :(得分:0)

简而言之,将MSG_OOB标记传递给send函数会将数据标记为“urgent”。有关Windows套接字实现细节上下文中的OOB的详细讨论,请参见here