c++ - 写入套接字接收的进程字符串的输入

标签 c++ linux windows sockets ssl

我在 Windows 平台上有一个应用程序,它从在 Linux 平台上运行的应用程序接收远程命令。

Linux 应用程序在访问包含重音字符的目录或文件时遇到困难,它们发送命令以访问此类文件/目录并且返回始终是:“找不到目录/文件”。

我认为这两个应用程序具有不同的code page,我敢这么说是因为我以前在linux应用程序中遇到过问题,带有重音字的目录和文件在中带有奇怪的符号std::cout,我在windows应用中添加了SetConsoleOutputCP (CP_UTF8)后问题就解决了,最后包含重音的路径是可读的,这是否意味着linux应用已经代码页 65001?不管怎样,当 linux 应用程序试图访问包含重音单词的路径时,发送包含目录/文件路径的字符串时问题仍然存在。

我将尝试展示这两个应用程序如何通信。

Windows 端:

简而言之,这是客户端从 linux 应用程序接收消息的部分,然后在进程中写入接收到的内容。在这部分中,当编写包含重音字符的路径时,应用程序会在无法找到它们的输出中返回。

BYTE buffer[4096];
DWORD BytesWritten;

int ret = SSL_read(stI->ssl, (char*)buffer, sizeof(buffer));
if (ret <= 0)
    break;

if(!WriteFile(stI->hStdIn, buffer, ret, &BytesWritten, NULL))
    break;

然后它读取进程的输出并将内容发送到 Linux 应用程序。

BYTE buffer[4096];
DWORD BytesAvailable, BytesRead;

if (!ReadFile(stI->hStdOut, buffer, min(sizeof(buffer), BytesAvailable), &BytesRead, NULL))
  break;

ret = SSL_write(stI->ssl, (char*)buffer, BytesAvailable);
if (ret <= 0)
  break;

Linux 端:

这部分非常基础,应用程序读取用户输入,然后将其发送到 Windows 应用程序。

std::string inputBuffer;
ZH->console_input(inputBuffer, 33); // This function only controls the input and output of data with termios.

inputBuffer+='\n' // To simulate an enter in windows application

// Sends the typed path to the Windows application
SSL_write(session_data.ssl, inputBuffer.c_str(), strlen(inputBuffer.c_str()))

接收数据的部分与windows应用程序基本相同,都是在char变量中接收数据,然后用std::cout打印到屏幕上。 唯一的区别是套接字设置为 NONBLOCK 而我使用的是 select 函数。

关于如何解决这个问题有什么建议吗?

最佳答案

最好的办法是使用正确的 unicode 编码。 Windows 倾向于使用 UTF-16(使用 2 个字节来表示一个字符),另一方面,Linux 使用 UTF-8。这通常对 ASCII 每个字符使用一个字节,并转义非 ASCII 字符(\uxxxx,其中 x 表示十六进制数字)。如果您从 Windows UTF-16 正确转换为 UTF-8,一切应该都能正常工作。

C++11 和 Boost确实提供了一些 Unicode 支持,但对于黄金标准支持,请查看 ICU .

然而,套接字仅传输字节,因此它们与 Unicode 转换无关。

关于c++ - 写入套接字接收的进程字符串的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41871224/

相关文章:

c++ - C++ 中未命名函数指针的语法

linux - 在bash中使用awk检索字符之间的字符串并分配给新变量

python - 无法在 Conda 环境中安装 Gensim - 找不到 noarch 目录

linux - 他们如何调试 Linux Kernel Core

windows - 为什么大多数进程都将 explorer.exe 作为其父进程

c++ - 如何知道安装了哪个版本的 firefox?

c++ - C++中Concurrent Queue + map的实现

c++ - 使用额外的模板类型参数作为类型别名声明以在函数的签名中使用

c++ - 如何通过函数指针调用不同签名的C++函数

linux - 复制服务器的全部内容