2013-05-14 236 views
0
for (;;) 
{ 
    if (msgrcv(msqid, &flag, sizeof(struct flags) - sizeof(long), 1, IPC_NOWAIT)>0) 
      break; 
} 
    msgsnd(msqid, &message , sizeof(struct messages) - sizeof(long), 0); 

有沒有像在sockets IPC任何accept()功能,但對於message queues IPC? 我的服務器應該等待客戶端連接,並且只有當客戶端連接時纔將數據發回給它。 我特別從客戶端發送一些無用的數據和檢查無限循環中的數據(這意味着客戶端連接,我知道這是非常愚蠢的算法)。在消息接受()隊列IPC UNIX

+0

http://beej.us/guide/bgnet/output/html/multipage/index.html - 閱讀本網絡教程以瞭解網絡基礎知識。 – VoidPointer 2013-05-14 15:31:27

回答

0

不,沒有什麼直接的相似之處。消息隊列更像無連接的數據報套接字,比它們像面向連接的流套接字(它支持accept()等等)。

某些實現(z/OS?)顯示在msgrcv上阻塞的進程數量與您正在查找的類似,但這不是可移植的。

正如我所見,您有兩個簡單的選擇。

首先,請在服務器的msgrcv中做你正在做的事情,但不要IPC_NOWAIT。如果你沒有做任何事情,那麼在循環中沒有任何意義。阻止直到客戶宣佈自己。 (並且使用不同的消息類型進行客戶端到服務器和服務器到客戶端的通信 - 您不希望客戶端將消息發送到服務器,反之亦然)。

其次,交換機到AF_UNIX流套接字,它會給你accept()能夠語義。