我有一个不寻常的情况:我在嵌入式情况下使用Linux系统(英特尔盒子,当前使用2.6.20内核.),它必须与具有部分损坏的TCP实现的嵌入式系统通信.就像我现在所知,他们希望我们的每条消息都来自一个单独的以太网帧!当消息在以太网帧中分离时,它们似乎有问题.
我们在设备的本地网络上,我们之间没有路由器(只是一个交换机).
当然,我们试图强迫他们修复他们的系统,但这可能最终不可行.
我已经在我的套接字上设置了TCP_NODELAY(我连接到它们),但这只有在我不尝试一次发送多条消息时才有用.如果我连续有几个传出消息,那些消息往往会在一个或两个以太网帧中结束,这会导致另一个系统出现问题.
我通常可以通过使用计时器来避免问题,以避免过于靠近地发送消息,但这显然限制了我们的吞吐量.此外,如果我把时间调低得太低,我冒着网络拥塞的风险,阻止数据包传输并最终允许我的多条消息进入同一个数据包.
有什么方法可以判断驱动程序是否有数据排队?有什么方法可以强制驱动程序在独立的传输层数据包中发送独立的写入调用?我已经查看了socket(7)和tcp(7)手册页,但我没有找到任何内容.可能只是因为我不知道我在寻找什么.
显然,UDP将是一条出路,但同样,我认为我们不能在这一点上让对方做出任何改变.
任何帮助非常感谢.
IIUC,设置TCP_NODELAY选项应该刷新所有数据包(即tcp.c通过调用tcp_push_pending_frames实现NODELAY的设置).因此,如果您在每次发送呼叫后设置套接字选项,您应该得到您想要的.