写入socket接收的进程字符串的输入

时间:2017-01-26 10:16:51

标签: c++ linux windows sockets ssl

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

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

我认为这两个应用程序有不同的代码页,我冒昧地说这是因为我以前在linux应用程序中遇到问题,带有重音词的目录和文件在{{1}中带有奇怪的符号在我在Windows应用程序中添加std::cout之后,问题就解决了,最后包含重音的路径是可读的,这是否意味着linux应用程序有代码页65001?无论如何,发送包含目录/文件路径的字符串时的问题仍然存在,每当linux应用程序尝试访问包含重音词的路径时,它都会失败。

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

Windows端:

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

SetConsoleOutputCP (CP_UTF8)

然后它读取进程的输出并将内容发送到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方面:

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

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;

接收数据的部分与Windows应用程序基本相同,它接收char变量中的数据,然后使用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())) 在屏幕上打印。 唯一的区别是套接字设置为NONBLOCK,我使用select函数。

有关如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:1)

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

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

然而,

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