X&0 Game IPC FIFO 窗口
X&0 Game IPC FIFO windows
我想用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
中的值中脱出了指针。这不是有效的指针!有几种方法:
- 使用新的
std::to_string
将值转换为std::string
。 - 由于您无论如何都可以混合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++;
}
}
}
相关文章:
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- SFML RenderWindow打开窗口需要很长时间
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 获取 SFML 窗口的 HWND 和高可用性?
- 如何获取 GLFW 窗口 ID?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 用于窗口的 HID 终端
- SFML 文本未绘制在窗口上
- X&0 Game IPC FIFO 窗口