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客户端
编辑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();
}
}