通过套接字发送结构并接收中文字母
Sending structure by socket and receiving chinese letters
我在C++有这个结构。
struct test
{
int num;
int quest;
wchar_t name[64];
};
int main()
{
test mystruct;
mystruct.num = 12;
mystruct.quest = 2;
memcpy(mystruct.name,var1,sizeof(var1)); // var1 is an char [64] with the request name
send(Socket->ConnectSocket, (char*)&mystruct, sizeof(test), 0);
}
另一方面,我有以下代码,用 C# 编写
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct test
{
public int num;
public int quest;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string name;
}
........
test structtest;
this.Receiver_og.Receive(this.buffer);
this.structtest = (test)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(test));
这段代码工作得很好,除了我只看到中文字母的字符串名称。我该如何解决它?
您正在将 char 数组(包含 8 位字符)复制到 wchar_t 数组中,该数组应包含 16 位 unicode 字符。简单地复制字符会给你一个 16 位字符,它是两个 8 位字符的组合,因此是垃圾。您需要使用 MultiByteToWideChar API 将 8 位字符转换为 unicode 字符。
如果这是您的全部代码,则似乎您没有设置连接。
据我所知,虽然我没有使用过 c++ 和 c# 中的套接字,但您需要通过创建套接字、设置选项、绑定、侦听然后进行通信来设置客户端/服务器。
您应该查看Beej的网络编程指南,他们几乎提供了设置客户端/服务器程序所需的一切,特别是第五章,他们引导您完成设置连接的过程。
相关文章:
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 我可以使用条件运算符初始化C风格的字符串文字吗
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 将数字打印成文字
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- C++17 十六进制浮点文字单精度后缀冲突?
- 常量函数,当其参数是对文字类型的引用时
- 连接 LPCSTR 变量和文字?
- 如何在 DevC++ 上显示带有中文字母的行?
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 指内置类型的文字
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 为什么文字不是常量(字符串除外)?