Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#[in Unity]和C++; 我正在开发一个Unity的脚本,它与C++通信,以便接收字节流。现在,我正在编写一个示例,其中两个进程通信一条标准消息,通过查看堆栈溢出,我发现了一些我决定使用的有趣示例 这是C++代码(与微软给出的示例相同,但我做了一些修改,以便了解正在发生的事情)_C#_C++_Unity3d_Ipc - Fatal编程技术网

C#[in Unity]和C++; 我正在开发一个Unity的脚本,它与C++通信,以便接收字节流。现在,我正在编写一个示例,其中两个进程通信一条标准消息,通过查看堆栈溢出,我发现了一些我决定使用的有趣示例 这是C++代码(与微软给出的示例相同,但我做了一些修改,以便了解正在发生的事情)

C#[in Unity]和C++; 我正在开发一个Unity的脚本,它与C++通信,以便接收字节流。现在,我正在编写一个示例,其中两个进程通信一条标准消息,通过查看堆栈溢出,我发现了一些我决定使用的有趣示例 这是C++代码(与微软给出的示例相同,但我做了一些修改,以便了解正在发生的事情),c#,c++,unity3d,ipc,C#,C++,Unity3d,Ipc,问题是:帖子已更新,请不要回答这些问题,请查看向下滚动的编辑 我不知道在哪里可以看到pchReply的内容,也不知道如何编辑它,评论说这是一个默认的数据字符串,但当数据交换完成时,C程序读取的字符串是“d” L> > P>服务器从C++接收请求字符串时,应该是服务器,服务器> /强>,打印到函数GetAnswerToRequest(C++代码的最后一个)中;因此,我总是得到“客户机请求字符串:?”而不是“客户机请求字符串:嗨,服务器” > P>这可能是最重要的:直到关闭C++服务器,C客户端

问题是:帖子已更新,请不要回答这些问题,请查看向下滚动的编辑

  • 我不知道在哪里可以看到pchReply的内容,也不知道如何编辑它,评论说这是一个默认的数据字符串,但当数据交换完成时,C程序读取的字符串是“d”

  • <> L> > P>服务器从C++接收请求字符串时,应该是<强>服务器,服务器> /强>,打印到函数GetAnswerToRequest(C++代码的最后一个)中;因此,我总是得到“客户机请求字符串:?”而不是“客户机请求字符串:嗨,服务器”

    > P>这可能是最重要的:直到关闭C++服务器,C客户端无法得到任何响应,它被阻塞等待。我把它写到C++代码的本质:有一个循环说“循环”直到完成读取,但是这个循环永远不会中断;另一个是(;;)的首字母

    我希望你能在这方面帮助我,如果你需要更多的细节,我会发布他们,我担心这个问题已经足够长了哈哈


    编辑1:

    谢谢你的回复,我关注的是我不需要任何强的字符串Stry<强>类型,无论是C还是C++,我都需要从C++到C语言传输一个二进制文件。以下是我更新的内容:

    C++

    C#:

    byte[]buffer=新字节[512000];
    int bytesRead=client.Read(缓冲区,0512000);
    int ReadLength=0;
    for(int i=0;i0)
    {
    字节[]Rc=新字节[ReadLength];
    块复制(Buffer,0,Rc,0,ReadLength);
    使用(BinaryWriter binWriter=newBinaryWriter(File.Open(“C:/Users/provolettaCS.p3d”,FileMode.Create)))
    {
    binWriter.Write(Rc);
    binWriter.Close();
    }
    初始化();
    
    现在,C++的标准响应可以正常工作,这意味着我创建的文件里面有:

    默认答案 来自服务器NULL (但不知道为什么最后会出现空值)

    但是我尝试将
    WriteFile
    函数中的“
    pchReply
    ”与我的变量
    raw
    交换,即
    uncompressedFile.rdbuf()
    ,但是当我尝试保存文件C端时,我保存了一堆空值


    < >我需要放置什么缓冲区而不是<代码> pChRetry>代码>以传输文件中的二进制信息?

    不能读取字符串C++类字符串C ^:< /p> 我将管道与CreateFile一起使用,而不是CreateNamePipe,不知道为什么(不是C++专家) 我有一个用于读取的管道和一个用于写入的管道。在这种情况下,缓冲区会自动填充0xCC。不知道为什么

    hPipe1=CreateFile(lpszPipename1,    GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    hPipe2=CreateFile(lpszPipename2,    GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    
        // Write the reply to the pipe. 
        fSuccess = WriteFile(
            hPipe1,        // handle to pipe 
            pchReply,     // buffer to write from 
            cbReplyBytes, // number of bytes to write 
            &cbWritten,   // number of bytes written 
            NULL);        // not overlapped I/O 
    
          //memset(pchReply, 0xCC, BUFSIZE);
    
    C端:必须读取字节

            using (var client = new NamedPipeClientStream(pipeName))
            {
              client.Connect(100);
              ASCIIEncoding encoder = new ASCIIEncoding();
              var writer = new StreamWriter(client);
              var request = "Hi, server.";
              writer.WriteLine(request);
              writer.Flush();
    
                byte[] buffer = new byte[512];
                int bytesRead = client.Read(buffer, 0, 512);
    
                int ReadLength = 0;
                for (int i = 0; i < 512; i++)
                {
                if (buffer[i].ToString("x2") != "cc")//end char?
                {
                    ReadLength++;
                }
                else
                    break;
                }
                if (ReadLength > 0)
                {
                byte[] Rc = new byte[ReadLength];
                Buffer.BlockCopy(buffer, 0, Rc, 0, ReadLength);
    
                Debug.Log("C# App: Received " + ReadLength +" Bytes: "+ encoder.GetString(Rc, 0, ReadLength));
                buffer.Initialize();
                }
            }
    
    使用(var client=new NamedPipeClientStream(pipeName))
    {
    客户端连接(100);
    ascienceoding编码器=新的ascienceoding();
    var writer=新的StreamWriter(客户端);
    var request=“你好,服务器。”;
    writer.WriteLine(请求);
    writer.Flush();
    字节[]缓冲区=新字节[512];
    int bytesRead=client.Read(缓冲区,0,512);
    int ReadLength=0;
    对于(int i=0;i<512;i++)
    {
    if(buffer[i].ToString(“x2”)!=“cc”)//结束字符?
    {
    ReadLength++;
    }
    其他的
    打破
    }
    如果(读取长度>0)
    {
    字节[]Rc=新字节[ReadLength];
    块复制(Buffer,0,Rc,0,ReadLength);
    Log(“C#App:Received”+ReadLength+”字节:“+encoder.GetString(Rc,0,ReadLength));
    初始化();
    }
    }
    
    <>你必须把所有字符从C++翻译成C……/P> 如果可以的话,试着使用ascii。因为如果你使用类,它将不容易


    <>我建议你用Socket代替NAMEPE……交换数据的难度会降低:

    < P>不能读取字符串C++类字符串C::/P> 我将管道与CreateFile一起使用,而不是CreateNamePipe,不知道为什么(不是C++专家) 我有一个用于读取的管道和一个用于写入的管道。在这种情况下,缓冲区会自动填充0xCC。不知道为什么

    hPipe1=CreateFile(lpszPipename1,    GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    hPipe2=CreateFile(lpszPipename2,    GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    
        // Write the reply to the pipe. 
        fSuccess = WriteFile(
            hPipe1,        // handle to pipe 
            pchReply,     // buffer to write from 
            cbReplyBytes, // number of bytes to write 
            &cbWritten,   // number of bytes written 
            NULL);        // not overlapped I/O 
    
          //memset(pchReply, 0xCC, BUFSIZE);
    
    C端:必须读取字节

            using (var client = new NamedPipeClientStream(pipeName))
            {
              client.Connect(100);
              ASCIIEncoding encoder = new ASCIIEncoding();
              var writer = new StreamWriter(client);
              var request = "Hi, server.";
              writer.WriteLine(request);
              writer.Flush();
    
                byte[] buffer = new byte[512];
                int bytesRead = client.Read(buffer, 0, 512);
    
                int ReadLength = 0;
                for (int i = 0; i < 512; i++)
                {
                if (buffer[i].ToString("x2") != "cc")//end char?
                {
                    ReadLength++;
                }
                else
                    break;
                }
                if (ReadLength > 0)
                {
                byte[] Rc = new byte[ReadLength];
                Buffer.BlockCopy(buffer, 0, Rc, 0, ReadLength);
    
                Debug.Log("C# App: Received " + ReadLength +" Bytes: "+ encoder.GetString(Rc, 0, ReadLength));
                buffer.Initialize();
                }
            }
    
    使用(var client=new NamedPipeClientStream(pipeName))
    {
    客户端连接(100);
    ascienceoding编码器=新的ascienceoding();
    var writer=新的StreamWriter(客户端);
    var request=“你好,服务器。”;
    writer.WriteLine(请求);
    writer.Flush();
    字节[]缓冲区=新字节[512];
    int bytesRead=client.Read(缓冲区,0,512);
    int ReadLength=0;
    对于(int i=0;i<512;i++)
    {
    if(buffer[i].ToString(“x2”)!=“cc”)//结束字符?
    {
    ReadLength++;
    }
    其他的
    打破
    }
    如果(读取长度>0)
    {
    字节[]Rc=新字节[ReadLength];
    块复制(Buffer,0,Rc,0,ReadLength);
    Debug.Log(“C#应用程序:已接收”
    
    hPipe1=CreateFile(lpszPipename1,    GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    hPipe2=CreateFile(lpszPipename2,    GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    
        // Write the reply to the pipe. 
        fSuccess = WriteFile(
            hPipe1,        // handle to pipe 
            pchReply,     // buffer to write from 
            cbReplyBytes, // number of bytes to write 
            &cbWritten,   // number of bytes written 
            NULL);        // not overlapped I/O 
    
          //memset(pchReply, 0xCC, BUFSIZE);
    
            using (var client = new NamedPipeClientStream(pipeName))
            {
              client.Connect(100);
              ASCIIEncoding encoder = new ASCIIEncoding();
              var writer = new StreamWriter(client);
              var request = "Hi, server.";
              writer.WriteLine(request);
              writer.Flush();
    
                byte[] buffer = new byte[512];
                int bytesRead = client.Read(buffer, 0, 512);
    
                int ReadLength = 0;
                for (int i = 0; i < 512; i++)
                {
                if (buffer[i].ToString("x2") != "cc")//end char?
                {
                    ReadLength++;
                }
                else
                    break;
                }
                if (ReadLength > 0)
                {
                byte[] Rc = new byte[ReadLength];
                Buffer.BlockCopy(buffer, 0, Rc, 0, ReadLength);
    
                Debug.Log("C# App: Received " + ReadLength +" Bytes: "+ encoder.GetString(Rc, 0, ReadLength));
                buffer.Initialize();
                }
            }