2017-01-26 5 views
0

Ich habe eine Anwendung auf der Windows Plattform, die Remote-Befehle von Anwendungen unter der Linux Plattform erhält.Schreiben an die Eingabe von Prozess-Strings empfangen von Socket

Die Linux Anwendungen haben Schwierigkeiten beim Zugriff auf Verzeichnisse oder Dateien, die akzentuierte Zeichen enthalten, sie senden den Befehl für den Zugriff auf solche Dateien/Verzeichnisse und die Rückkehr ist immer: "Verzeichnis/Datei nicht gefunden".

Ich denke, die beiden Anwendungen sind mit unterschiedlicher Codepage, wage ich das zu sagen, weil ich in Linux-Anwendungen, die bisher Probleme hatte, kamen die Verzeichnisse und Dateien mit akzentuierten Worten mit seltsamen Symbolen in std::cout, und nachdem ich hinzugefügt SetConsoleOutputCP (CP_UTF8) In der Windows-Anwendung wurde das Problem gelöst, und schließlich waren die Pfade, die Akzente enthielten, lesbar. Bedeutet das, dass die Linux-Anwendung die Codepage 65001 hat? Wie auch immer, das Problem beim Senden von Strings, die den Pfad zu den Verzeichnissen/Dateien enthalten, besteht immer noch, wenn die Linux-Anwendung versucht, auf Pfade zuzugreifen, die Akzentwörter enthalten, die fehlschlagen.

Ich versuche zu zeigen, wie die beiden Anwendungen kommunizieren.

Windows-Seite:

Kurz gesagt, das ist der Teil, in dem der Client die Nachricht von der Linux-Anwendung empfängt, und schreibt dann in dem Prozess, was empfangen wurde. Wenn in diesem Teil Pfade mit Akzentzeichen geschrieben werden, gibt die Anwendung in der Ausgabe zurück, die nicht gefunden werden kann.

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; 

Und dann liest es die Ausgabe des Prozesses und sendet den Inhalt an die Linux-Anwendung.

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 Seite:

Dieser Teil ist sehr einfach, liest die Anwendung eine Benutzereingabe und sendet sie dann an die Windows-Anwendung.

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())) 

Der Teil der Daten zu empfangen ist grundsätzlich das gleiche wie die Windows-Anwendung, ist es die Daten in einer variablen char empfängt und dann mit std::cout auf dem Bildschirm gedruckt werden. Der einzige Unterschied ist, dass der Socket auf NONBLOCK gesetzt ist und ich die Select-Funktion verwende.

Irgendwelche Vorschläge zur Lösung dieses Problems?

+0

Nicht verwandt mit Ihrem Problem, aber Sie kennen die Funktion ['std :: string :: length]] (http://en.cppreference.com/w/cpp/string/basic_string/size)? –

+0

@Someprogrammerdude ich weiß, sprichst du über ssl schreiben? ist besser verwenden inputBuffer.length()? –

+1

Wie für Ihr Problem, können Sie bitte erarbeiten? Was senden Sie vom Linux-Programm an das Windows-Programm? Was erhält das Windows-Programm? Was wird in die Datei geschrieben? –

Antwort

1

Ihre beste Wette ist die Verwendung geeigneter Unicode-Kodierungen. Windows neigt dazu, UTF-16 zu verwenden (verwendet 2 Bytes, um ein Zeichen darzustellen), Linux hingegen verwendet UTF-8. Dies verwendet normalerweise ein einzelnes Byte pro Zeichen für ASCII und entkoppelt nicht-ASCII-Zeichen (\ uxxxx, wobei x für eine hexadezimale Ziffer steht). Wenn Sie eine ordnungsgemäße Konvertierung von Windows UTF-16 zu UTF-8 vornehmen, sollten die Dinge richtig funktionieren.

C++ 11 und Boost bieten einige Unicode-Unterstützung, aber für Gold-Standard-Unterstützung, werfen Sie einen Blick auf ICU.

Sockets übertragen jedoch nur Bytes, also haben sie nichts mit Unicode-Konvertierungen zu tun.

+0

Haben Sie Vorschläge, wie ich die Conversions durchführen kann? In welcher Anwendung sollte ich tun? Ich kann Boost in dieser Anwendung verwenden. Ich habe alle Arten von Konversionen ausprobiert, ich mache das die ganze Nacht. –

+0

http://www.boost.org/doc/libs/1_61_0/libs/locale/doc/html/charset_handling.html – doron

Verwandte Themen