写入套接字接收的进程字符串的输入
Write to the input of process strings received by socket
我在Windows平台上有一个应用程序,它从运行在Linux上的应用程序接收远程命令。
Linux应用程序在访问包含重音字符的目录或文件时遇到困难,它们会发送访问此类文件/目录的命令,返回的结果总是:"directory/file not found"。
我认为这两个应用程序有不同的代码页,我敢这么说是因为我以前在linux应用程序中遇到过问题,带有重音单词的目录和文件在std::cout
中带有奇怪的符号,在windows应用程序中添加SetConsoleOutputCP (CP_UTF8)
后,问题得到了解决,最终包含重音的路径是可读的,这是否意味着linux应用程序具有代码页65001?无论如何,当发送包含目录/文件路径的字符串时,问题仍然存在,每当linux应用程序试图访问包含重音单词的路径时,它都会失败。
我将尝试展示这两个应用程序是如何通信的。
窗口端:
简而言之,这是客户端从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++中创建总是在循环中接受新输入的独立进程
- 当使用带有stdin和stdout重定向的双进程管道时,如何避免stdin上的重复输入
- 如何使用 std::in 和 getline() 检测后台进程中从 bash 注入的输入
- 如何防止父进程在孩子死后丢失控制台输入?
- 写入套接字接收的进程字符串的输入
- C++ microshell,输入一个命令并使用fork(),dup(),pipe()将其通过管道传输到进程。只是我没有得到我想要的结果
- 服务器进程等待客户端输入/消息的最佳方法是什么?
- 确定进程的输入线程 ID
- Windows:如何让子进程在不关闭输入匿名管道的情况下读取它
- 可以从用户检索输入并运行另一个进程
- 创建一个进程并重定向其输入/输出,并且不继承套接字句柄
- 将输入数据发送到节点.js中的子进程
- 重定向子进程的输入和输出不起作用
- 使用SendMessage将文本输入到属于另一个进程的编辑控件中
- 如何在Linux应用程序上使用C++中的终端输入中断循环/进程
- 如何与Node.js进程中的C++程序输入流进行交互
- Python将输入重定向到子进程
- 使用MPI程序,所有进程都从用户输入获取数据
- OS X获取远程进程输入参数有时会失败
- 如何获取Windows C++中进程(输入:进程ID或句柄)的每秒接收和发送网络字节数?