Joh*_*nck 14 c connection posix client-server message-queue
我有客户端和服务器程序,现在通过TCP进行通信.我正在尝试使用POSIX消息队列(当然,在客户端和服务器位于同一台机器上的情况下).我希望它能提高性能(特别是通过减少延迟).
我已经解决了大部分问题,但我不确定一件事:如何建立"连接".服务器同时接受来自多个客户端的连接,所以我很想模仿TCP连接建立过程,如下所示:
select(2)
像TCP一样使用).您可能会看到此方案与常见的TCP方法类似,这并非偶然.但是,我想知道:
请记住,之前我没有使用POSIX消息队列(我之前使用过的是IBM WebSphere MQ,但这有点不同).该平台是Linux.
你能想到一个更好的方法吗?
也许看看fifos(又名命名管道).它们就像网络套接字,但对于本地机器.它们是单向的,因此您可能需要为每个方向创建两个,一个.您的问题确实没有任何理由说明您为何具体进行此更改.使用套接字进程来处理通信没有任何问题.它们是双向的,高效的,广泛支持的,并且可以让您在以后自由地分离机器之间的过程.
你看到我的方法有任何潜在的问题吗?
System V消息队列和fifo命名管道都非常好.Fifo管道就像常规管道,所以你可以用最少的代码更改来读取()和write().System V消息队列需要将数据放入结构并调用msgsnd().然而,任何一种方法都可以.
您是否有任何其他想法,包括在同一台计算机上使用消息队列而不是TCP实际上可以提高性能(延迟)的可能性?
我的其他想法是,正如你所说,你需要开发一种技术,以便每个客户都有一个唯一的标识符.一种方法是将pid添加到您传递的结构中,或者在开头与父/ master协商唯一ID.另外需要注意的是,System V消息队列的好处是您可以侦听"选择性"消息,因此您可以理想地使用从服务器到所有客户端的一个队列,每个客户端等待不同的消息.
我不知道哪种技术可以为您提供最佳的软件吞吐量.使用System V消息队列确实可能不值得,但只有您可以做出决定.
Philluminati
我最终基本上按照我的描述实现了它,并进行了一些增强:
握手比TCP简单,但似乎足够了.
至于延迟:它好多了.在同一台计算机上使用POSIX消息队列而不是TCP,大约减少75%的延迟.我的消息大约每个100字节.