X&0 Game IPC FIFO 窗口

X&0 Game IPC FIFO windows

本文关键字:FIFO 窗口 IPC Game      更新时间:2023-10-16

我想用ipc在C中制作X& 0游戏。我声明3个char阵列,阅读witch line the Witch line,以及在哪个位置放置x或0。当我尝试哪个位置。要从客户端通过FIFO发送行号,服务器将收回不同的数字。例如,我发送1,服务器获取3144200 ....这是代码,而不是全部读写。这是服务器:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
int main() {
HANDLE f1, f2;
DWORD x;
char l1[3]="";
char l2[3]="";
char l3[3]="";
char X='x';
char* a="";
char* lineChar="";
int n=1,lineInt=0,coor=0;
printf("I am the server n");
printf("You will play with xn");
// creating pipes
f1=CreateNamedPipe(TEXT("\\.\PIPE\fifo1"), PIPE_ACCESS_INBOUND,PIPE_TYPE_BYTE|PIPE_WAIT, 3, 0, 0, 0, NULL);
f2=CreateNamedPipe(TEXT("\\.\PIPE\fifo2"), PIPE_ACCESS_OUTBOUND,PIPE_TYPE_BYTE|PIPE_WAIT, 3, 0, 0, 0, NULL);
ConnectNamedPipe(f1, NULL);
ConnectNamedPipe(f2, NULL);
while(n<=9){
    for(int i=0;i<=2;i++){
        printf("[%s]",&l1[i]);
    }
    printf("n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l2[i]);
    }
    printf("n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l3[i]);
    }
    printf("n");
    printf("You will begin,select the line from 1 to 3 : n");
    scanf_s("%d",&lineInt);
    x=0;
    lineChar=reinterpret_cast<char*>(lineInt);
    printf("%s",lineChar);
    //strcpy_s(a,sizeof(lineChar),lineChar);
    if (WriteFile(f2,lineChar,sizeof(lineChar)+1, &x, NULL)==0) {
                printf("writing error..%dn", x);
    }
    n++;
}
DisconnectNamedPipe(f1);
DisconnectNamedPipe(f2);
CloseHandle(f1);
CloseHandle(f2);
}

这是客户:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
int main(){
HANDLE f1, f2;
DWORD x;
char l1[3]="";
char l2[3]="";
char l3[3]="";
char o='0';
char* lineChar="";
int n=1,lineInt=0,coor=0;
printf("I am the client n");
printf("You will play with 0n");
    // connect to pipes created by server
f1=CreateFile(TEXT("\\.\PIPE\fifo1"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
f2=CreateFile(TEXT("\\.\PIPE\fifo2"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
while(n<=9){
    for(int i=0;i<=2;i++){
        printf("[%s]",&l1[i]);
    }
    printf("n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l2[i]);
    }
    printf("n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l3[i]);
    }
    printf("n");
    x=0;
    Sleep(3000);
    if (ReadFile(f2, lineChar, sizeof(lineChar), &x, NULL)==0) {
                printf("reading error..%dn", x);
            }
    printf("%s",lineChar);
    //lineInt=atoi(lineChar);
    //printf("n%dn",lineInt);
    n++;
}
CloseHandle(f1);
CloseHandle(f2);
}

您的代码中的字符串和指针有很多或问题。

首先您按照 strings 在数组中打印出单个字符,这将导致怪异的输出。

其次,是问题的原因,当您调用WriteFile时,使用sizeof(lineChar)返回指针的大小,而不是字符串的长度。改用strlen

您问题的第二个原因是您将整数投放到字符串上。这将不起作用!语句

lineChar=reinterpret_cast<char*>(lineInt);

确实是它从lineInt中的值中脱出了指针。这不是有效的指针!有几种方法:

  1. 使用新的std::to_string将值转换为std::string
  2. 由于您无论如何都可以混合C和C ,因此也可以使用sprintf

您的程序有很多所谓的不确定的行为,您应该很高兴它们都没有崩溃。

#include<stdio.h>
#include<string.h>
int main(){
char l1[3]="";
char l2[3]="";
char l3[3]="";
char x='x';
char o='0';
int n=1,lineInt=0,coor=0,next=1;
printf("X & 0 Game :  n");
while(n<=3){
    for(int i=0;i<=2;i++){
        printf("[%s]",&l1[i]);
    }
    printf("n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l2[i]);
    }
    printf("n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l3[i]);
    }
    printf("n");
    switch (next){
        case 1 :{
            printf("To select the line enter 1,2 or 3 : n");
            scanf_s("%d",&lineInt);
            switch (lineInt){
                case 1 :{
                    printf("Enter the coordinates : n");
                    scanf_s("%d",&coor);
                    //printf("%c",x);
                    //printf("%d",coor);
                    //strcpy_s(&l1[coor],1,"x");
                    l1[coor]=x;
                    break;
                }
                case 2 :{
                    printf("Enter the coordinates : n");
                    scanf_s("%d",&coor);
                    l2[coor]=x;
                    break;
                }
                case 3 :{
                    printf("Enter the coordinates : n");
                    scanf_s("%d",&coor);
                    l2[coor]=x;
                    break;
                }
        next=2;
        }
        for(int i=0;i<=2;i++){
            printf("[%s]",&l1[i]);
        }
        printf("n");
        for(int i=0;i<=2;i++){
            printf("[%s]",&l2[i]);
        }
        printf("n");
        for(int i=0;i<=2;i++){
            printf("[%s]",&l3[i]);
        }
        printf("n");
        case 2 :{
            printf("To select the line enter 1,2 or 3 : n");
            scanf_s("%d",&lineInt);
            switch (lineInt){
                case 1 :{
                    printf("Enter the coordinates : n");
                    scanf_s("%d",&coor);
                    l1[coor]=o;
                    break;
                }
                case 2 :{
                    printf("Enter the coordinates : n");
                    scanf_s("%d",&coor);
                    l2[coor]=o;
                    break;
                }
                case 3 :{
                    printf("Enter the coordinates : n");
                    scanf_s("%d",&coor);
                    l2[coor]=o;
                    break;
                }
        next=2;
        }
    }
}
n++;
}
}

}