【问题标题】:Write to the input of process strings received by socket写入套接字接收的进程字符串的输入
【发布时间】:2017-06-11 19:00:50
【问题描述】:

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

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

我认为这两个应用程序具有不同的代码页,我冒昧地这么说是因为我以前在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在屏幕上打印。 唯一不同的是socket设置为NONBLOCK,而我使用的是select函数。

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

【问题讨论】:

  • 与您的问题无关,但您知道std::string::length 函数吗?
  • @Someprogrammerdude 我知道,你说的是 ssl write 吗?更好地使用 inputBuffer.length()?
  • 至于你的问题,能详细点吗?你从 Linux 程序向 Windows 程序发送了什么? Windows 程序接收什么?文件中写入了什么?
  • @Someprogrammerdude 该应用程序就像 Windows 的 ssh。只发送命令,并接收 windows shell 的输出。但是,在带有重音字的应用程序之间存在这种小的字符冲突问题。

标签: c++ linux windows sockets ssl


【解决方案1】:

最好的办法是使用正确的 unicode 编码。 Windows 倾向于使用 UTF-16(使用 2 个字节来表示一个字符),而 Linux 则使用 UTF-8。这通常对 ASCII 字符使用单个字节,并转义非 ascii 字符(\uxxxx,其中 x 表示十六进制数字)。如果您从 Windows UTF-16 到 UTF-8 进行了正确的转换,那么一切应该可以正常工作。

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

但是,套接字只是传输字节,因此它们与 Unicode 转换无关。

【讨论】:

  • 您对我如何进行转换有什么建议吗?我应该在哪个应用程序中做?我可以在这个应用程序中使用 boost。我尝试了各种转换,我整晚都在这样做。
猜你喜欢
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2013-05-25
相关资源
最近更新 更多