什么是更好的方法:1管道和1插座,或1插座?

问题描述:

我有一个服务器程序处理音频数据并将其传递给音频驱动程序。什么是更好的方法:1管道和1插座,或1插座?

服务器程序复制音频数据并将该副本放入一个命名的FIFO中的一个秒钟线程中。

如果在FIFO的另一端没有客户端读取,则无关紧要,因为它只是阻塞了FIFO线程。

现在我想添加一个“控制”功能,如“增加音量,播放速度更快”等。所以最终连接的客户端可以控制服务器程序。

重要的是:如果客户端最终断开连接(通过close()或中止),服务器检测到这一点并应回退到正常模式并忘记客户端的所有命令。

我从来没有使用插座到现在为止,所以我不知道什么是最好的方式:

  1. 使用FIFO从服务器 - >客户端,因为它是添加一个插座只为客户端 - >服务器通信?

  2. 使用一个插座到流服务器 - >客户端和客户端 - 从下达指令>服务器(以字节格式?)

我会用“AF_UNIX,SOCK_STREAM”套接字。 #2是更好的变种?我怎样才能确定客户端没有关闭()连接断开?

+0

并不罕见使用多个连接做不同的事情,见例如FTP。但是,如果协议允许,也可以使用相同的连接来完成不同的事情。 – 2013-05-07 12:50:55

我投票选项NR 2和应该是一个可能的解决方案是:

1-创建套接字[SOCK_STREAM ....];

2-fork()[inherits the socket descriptor];

-father[use to read]; 
-son[use to write]; 

,你可以实现检测客户端断开连接从套接字描述符返回阅读()时0bytes

+0

好的,客户也一样,是吗?一个线程/ fork来接收数据,另一个线程最终写入命令?你知道如何确定客户是否没有适当的关闭而退出? – 2013-05-07 12:55:36

+0

是的,所以它可以是双向的,这是可以确定的,因为当读取(从sock fd)返回0字节意味着另一端已经接近aka断开连接 – 2013-05-07 12:57:41

+0

好啊,我会试试,谢谢! – 2013-05-07 13:03:43