0

我正在尝试使用 FIFO(命名管道)和共享内存与服务器客户端制作井字游戏。

第一步是将客户端进程的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 个客户端正在运行,我应该怎么做?

非常感谢,阿萨夫。

4

1 回答 1

1

像这样组织逻辑的一种方法是作为服务器进程的有限状态机

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

状态机是对此类更改进行建模的便捷方式。

就代码而言,如果您的服务器不需要一直做任何事情(但只是为了响应实际的客户端通信,即玩家移动),最简单的方法是使用读取客户端数据的中央循环来组织它(并接受新客户),然后可能有一个switch/case语句来处理数据,具体取决于它所处的状态,或其他东西。

于 2013-05-17T09:46:02.760 回答