2013-05-07 38 views
0

我有一個服務器程序處理音頻數據並將其傳遞給音頻驅動程序。什麼是更好的方法:1管道和1插座,或1插座?

服務器程序複製音頻數據並將該副本放入一個命名的FIFO中的一個秒鐘線程中。

如果在FIFO的另一端沒有客戶端讀取,則無關緊要,因爲它只是阻塞了FIFO線程。

現在我想添加一個「控制」功能,如「增加音量,播放速度更快」等。所以最終連接的客戶端可以控制服務器程序。

重要的是:如果客戶端最終斷開連接(通過close()或中止),服務器檢測到這一點並應回退到正常模式並忘記客戶端的所有命令。

我從來沒有使用插座到現在爲止,所以我不知道什麼是最好的方式:

  1. 使用FIFO從服務器 - >客戶端,因爲它是添加一個插座只爲客戶端 - >服務器通信?

  2. 使用一個插座到流服務器 - >客戶端和客戶端 - 從下達指令>服務器(以字節格式?)

我會用「AF_UNIX,SOCK_STREAM」套接字。 #2是更好的變種?我怎樣才能確定客戶端沒有關閉()連接斷開?

+0

並不罕見使用多個連接做不同的事情,見例如FTP。但是,如果協議允許,也可以使用相同的連接來完成不同的事情。 – 2013-05-07 12:50:55

回答

0

我投票選項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