我尝试使用FIFO(命名管道)和共享内存与服务器客户端进行Tic Tac Toe游戏。
第一步是将客户端进程的pid写入FIFO。 在服务器进程中,我需要等到FIFO中传递了2个pid(来自2个不同的客户端进程)。
现在我只是从管道中读取2但它不能正常工作。我需要在while循环中阅读吗?
客户端代码:
#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个客户端运行,我该怎么做?
非常感谢, 阿萨夫。
答案 0 :(得分:1)
组织这样的逻辑的一种方法是作为服务器进程的finite-state machine。
它将以某种初始状态启动,然后进入等待客户端连接的状态,以及已连接的客户端发送PID。这是两个独立的事件,可以按任何顺序发生。一旦连接了两个客户端并发送了它们的PID,服务器就可以进入初始化游戏的状态,依此类推。
状态机是对这些更改进行建模的便捷方式。
就代码而言,如果您的服务器不需要一直做(但仅响应实际的客户端通信,即玩家进行移动),最简单的方法是使用一个读取客户端数据的中央循环来组织它(并接受新客户),然后可能有一个switch/case
语句来处理数据,具体取决于它所处的状态,或者其他东西。