我必須在我的代碼中使用fifo。如何接收來自多個命名管道的消息?
我用襪子接受新的客戶。對於每位客戶,我都會創建新的線程來發送和接收消息給他。
在我使用FIFO來發送和還接收郵件到另一個進程,並在此線程的功能是我的代碼:
int s_to_c=open(myfifo1,O_WRONLY);
int c_to_s=open(myfifo2,O_RDONLY);
char echoBuffer[RCVBUFSIZE];
int recvMsgSize;
for(;;)
{
bzero(echoBuffer,RCVBUFSIZE);
read(c_to_s, echoBuffer, RCVBUFSIZE);
write(sock, echoBuffer, strlen(echoBuffer));
bzero(echoBuffer,RCVBUFSIZE);
read(sock, echoBuffer, RCVBUFSIZE);
write(s_to_c,echoBuffer,strlen(echoBuffer));
}
close(c_to_s);
close(s_to_c);
close(sock);
而在另一邊(另處理)我的代碼:
int s_to_c=open(myfifo1,O_RDONLY);
int c_to_s=open(myfifo2,O_WRONLY);
char echoBuffer[RCVBUFSIZE];
int recvMsgSize;
for(;;)
{
bzero(echoBuffer,RCVBUFSIZE);
fgets(echoBuffer,RCVBUFSIZE,stdin);
echoBuffer[strlen(echoBuffer)-1]='\0';
write(c_to_s, echoBuffer, strlen(echoBuffer));
bzero(echoBuffer,RCVBUFSIZE);
read(s_to_c, echoBuffer, RCVBUFSIZE);
printf("%s\n", echoBuffer);
}
我的問題是在這個過程中:s_to_c
和c_to_s
採取總是值(3,4)。
所以第一個客戶端連接正確的發送和接收他的消息。
但是,當第二次連接第一個客戶端變爲禁用。第二個客戶端的消息發送和接收來自這兩個進程。
我可以幫忙嗎?我應該使用標籤嗎?
在您的實際代碼中,您*有*有錯誤檢查?並且文件描述符得到的值無關緊要,在另一個進程中,文件描述符「3」(例如)與文件描述符「3」不同。你總是得到相同的意思就是說,在打開管道之前,你還沒有使用過任何其他的描述符。 –
對不起,我完全不明白你的意思。 我的代碼對第一個客戶端正確執行。 在服務器中,我輸出值: sock = 4。 s_to_c = 6。 c_to_s = 7。 在這個過程中,我有這個值: s_to_c = 3。 c_to_s = 4。 –
就像我說過的,描述符的數字真的不相關,不用擔心。 –