如何接收来自多个命名管道的消息?
How Can I receive messages from more than one named pipes?
我必须在我的代码中使用 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]='[=11=]';
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)。
所以第一个客户端连接正确发送和接收他的消息。
但是当第二个连接时,第一个客户端变成 disable.And 第二个客户端的消息在两个进程之间发送和接收。
我能得到一些帮助吗please.Should 例如我必须使用标签??
select()
允许您检查文件描述符的状态(在您的情况下是连接到管道的文件描述符)。当select()
returns时,它告诉你哪些管道有数据要处理。这样,您就可以监控服务器进程中的许多管道。
客户端进程将始终为管道使用文件描述符 3 和 4,因为它们是 stdio 之后的第一个空闲文件(0=stdin,1=stdout,2=stderr)。所以这是正确的。
如果您在服务器上也看到 3 和 4 的组合,那么您在创建管道的代码中有错误,而不是在您使用它们的地方。
如果您使用 Linux,有一种简单的方法可以查看文件描述符连接到什么:查看 /proc/PID/fd/
(将 PID 替换为您要检查的进程的 ID)或使用 lsof -n -p PID
(它显示了很多其他东西以及加载的共享库)。
我必须在我的代码中使用 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]='[=11=]';
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)。
所以第一个客户端连接正确发送和接收他的消息。
但是当第二个连接时,第一个客户端变成 disable.And 第二个客户端的消息在两个进程之间发送和接收。
我能得到一些帮助吗please.Should 例如我必须使用标签??
select()
允许您检查文件描述符的状态(在您的情况下是连接到管道的文件描述符)。当select()
returns时,它告诉你哪些管道有数据要处理。这样,您就可以监控服务器进程中的许多管道。
客户端进程将始终为管道使用文件描述符 3 和 4,因为它们是 stdio 之后的第一个空闲文件(0=stdin,1=stdout,2=stderr)。所以这是正确的。
如果您在服务器上也看到 3 和 4 的组合,那么您在创建管道的代码中有错误,而不是在您使用它们的地方。
如果您使用 Linux,有一种简单的方法可以查看文件描述符连接到什么:查看 /proc/PID/fd/
(将 PID 替换为您要检查的进程的 ID)或使用 lsof -n -p PID
(它显示了很多其他东西以及加载的共享库)。