Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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+的C#数据包+;winsockets 我只是想在我的两个应用程序之间来回发送数据包,但是我的字符串在C++中没有被通过。下面是我在c中所做的#_C#_C++_Sockets_Marshalling_Winsock - Fatal编程技术网

发送到C+的C#数据包+;winsockets 我只是想在我的两个应用程序之间来回发送数据包,但是我的字符串在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

这是我在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(this, data, sizeof(Packet));
}
};

char network_data[MAX_PACKET_SIZE];
recv(curSocket, buffer, MAX_PACKET_SIZE, 0);

唯一有效的值是结构中的第一个数据包类型。那一个总是通过的。我缺少什么?

您有几个问题:

  • 在C端,封送处理大小定义为32字节,而不是4+2*8*4=68字节。最好删除
    structureloayout
    中的
    Size
    字段
  • 在C++中定义了代码> char < /> >而不是<代码> WCARAX T,在C的边上有Unicode字符串
  • 您定义了指针而不是数组,因此:
    • sizeof(数据包
      )为20
    • memcpy
      在数据包结构外部复制
    • 代码试图访问无效内存,因为它将字符串值转换为指针
  • C++包中的p>应定义为:

    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...
            }