2013-05-17 79 views
0

我试图用服务器客户端使用FIFO(命名管道)和共享内存制作井字游戏。等到2 pid写入FIFO(命名管道)

第一步是将客户端进程的pid写入FIFO。 而在服务器进程中,我需要等到2个pid通过FIFO(来自2个不同的客户端进程)。

现在我只是在做2从管道读取,但它不适用。我需要阅读一段时间循环或什么?

客户端代码:

#include <stdio.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

void main() 
{ 
    int fd; 
    int pid=getpid(); 
    pid_t pid1=getpid(); 
    fd=open("fifo_clientTOserver",O_WRONLY); 

    write(fd,&pid1,sizeof(pid_t)); 
    printf("%d\n",pid1); 
    while(1); 

} 

服务器代码:

#include <stdio.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

void main() 
{ 
    int fd; 
    pid_t pid; 
    ftok("shmdemo.c","j"); 
    mkfifo("fifo_clientTOserver",400); 
    fd=open("fifo_clientTOserver",O_RDONLY); 
    read(fd,&pid,sizeof(pid_t)); 
    printf("%d",pid); 
    read(fd,&pid,sizeof(pid_t)); 
    printf("%d",pid); 


//sleep(2); 
} 

我想该服务器将等到2个客户端运行的,我应该怎么做呢?

非常感谢, Asaf。

回答

1

组织这种逻辑的一种方法是作为服务器进程的finite-state machine

它会以某种初始状态启动,然后进入等待客户端连接的状态,并且也用于已连接的客户端发送PID。这是两个单独的事件,可以按任何顺序发生。一旦两个客户端连接并发送了它们的PID,服务器就可以进入初始化游戏的状态,依此类推。

状态机是建模这种变化的便捷方式。在代码方面,如果你的服务器不需要一直做事情(但只是为了响应实际的客户端通信,即玩家做出动作),最简单的方法是用一个读取客户端的中央循环来组织它数据(并接受新的客户端),那么可能有一个switch/case声明来处理数据,这取决于它所处的状态,或者其他。

相关问题