发送到C+的C#数据包+;winsockets 我只是想在我的两个应用程序之间来回发送数据包,但是我的字符串在C++中没有被通过。下面是我在c中所做的#
这是我在c中得到的++发送到C+的C#数据包+;winsockets 我只是想在我的两个应用程序之间来回发送数据包,但是我的字符串在C++中没有被通过。下面是我在c中所做的#,c#,c++,sockets,marshalling,winsock,C#,C++,Sockets,Marshalling,Winsock,这是我在c中得到的++ struct Packet { unsigned int packet_type; char* file_name; char* template_name; char* file_name_list; char* file_data; void serialize(char * data) { memcpy(data, this, sizeof(Packet)); } void deserialize(char * data) { memcpy(t
struct Packet {
unsigned int packet_type;
char* file_name;
char* template_name;
char* file_name_list;
char* file_data;
void serialize(char * data) {
memcpy(data, this, sizeof(Packet));
}
void deserialize(char * data) {
memcpy(this, data, sizeof(Packet));
}
};
char network_data[MAX_PACKET_SIZE];
recv(curSocket, buffer, MAX_PACKET_SIZE, 0);
唯一有效的值是结构中的第一个数据包类型。那一个总是通过的。我缺少什么?您有几个问题:
structureloayout
中的Size
字段
)为20sizeof(数据包
在数据包结构外部复制memcpy
- 代码试图访问无效内存,因为它将字符串值转换为指针
struct Packet {
unsigned int packet_type;
wchar_t file_name[8];
wchar_t template_name[8];
wchar_t file_name_list[8];
wchar_t file_data[8];
// ...
};
尽管我从未尝试过这种方法,但我认为您不能简单地使用winsock在两个不同的应用程序之间共享数据,然后只传递指针。内存在两者之间受保护 您需要将数据序列化到内存流。使用适当的类对字符串进行编码等。然后在C++应用程序中反序列化它。
尝试下面的东西来做你的C语言应用程序,然后在C++中做逆运算,它会工作。另一种方法是先读取4个字节,告诉字符串前面要读取多少。。。。读取字符串。。。继续下一步,直到找到文件结束标记
string myString = "abc";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(myString);
using (MemoryStream ms = new MemoryStream())
{
ms.Write(BitConverter.GetBytes(buffer.Length), 0, 4);
ms.Write(buffer, 0, buffer.Length);
//... rest of code...
}
问题是您将字符串作为指针传递。指针仅在同一进程中有效。如果您的C#为2.0或更高,请将结构更改为:
[StructLayout(LayoutKind.Sequential,Pack=1)]
公共不安全结构包
{
公共uint数据包类型;
公共固定字符文件名[??];
公共固定字符模板名称[??];
公共固定字符文件名称列表[??];
公共固定字符文件缓冲区[??];
}
#pragma包(推送,1)
结构包{
无符号整数包类型;
wchar_t文件名[??];
wchar_t模板名称[??];
wchar_t文件名_列表[??];
wchar_t文件数据[??];
无效序列化(字符*数据){
memcpy(数据,this,sizeof(数据包));
}
无效反序列化(字符*数据){
memcpy(this,data,sizeof(Packet));
}
};
#布拉格语包(流行语)
替换<代码>?/>代码>您想要的大小,C和C++都必须是相同大小的。不要忘记在每个字符串的末尾添加空字符。
我尝试了其他所有答案,这是我能够找到的答案。除了使用这种方法将编码更改为UNIODEE之外,我在C++方面遇到了一个问题。如果你能帮我解决这个问题,也许?你的问题似乎得到了回答,我想现在你解决了所有的问题 string myString = "abc";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(myString);
using (MemoryStream ms = new MemoryStream())
{
ms.Write(BitConverter.GetBytes(buffer.Length), 0, 4);
ms.Write(buffer, 0, buffer.Length);
//... rest of code...
}