[C++] stdin lezen tot EOF

Pagina: 1
Acties:

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 22:11

Snow_King

Konijn is stoer!

Topicstarter
Beste Tweakers,

Ik heb mijn eerste stapjes gezet op het gebied van C++ en nu loop ik vast.

Wat wil ik doen?
Ik wil via een TCP Socket een XML file doorsturen naar een server en deze aldaar verwerken en een response op geven.

Voor de socket afhandeling maak ik gebruik van tcpserver, deze bind aan een poort en alle inkomende data wordt via stdin doorgegeven aan een te specifieren executable.

Welke code heb ik?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>

using namespace std;

#define AUTHSTRING_FILE "/home/wido/authstring"

int main(void) {
    string input, currentLine, authString;
    
    while (!cin.eof())  {
        getline(cin, currentLine);
        input += currentLine;
    }
    
    ifstream IN_FILE(AUTHSTRING_FILE);
    IN_FILE >> authString;
    IN_FILE.close();

    cout << authString;

    return 0;
}


Op de prompt werkt dit goed, als ik het volgende doe:
code:
1
./stdin < test.xml


Dan krijg ik de contents van de file /home/wido/authstring als return.

Nu wil ik echter via TCP/IP gaan communiceren via tcpserver en dat gaat ook goed.

Doe ik:
code:
1
telnet localhost 9000 < test.xml


Gaat het ook goed.

Nu heb ik echter een stukje PHP code gemaakt waar iets in fout gaat.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$out = file_get_contents("/home/wido/c++/test.xml");

$socket = fsockopen("localhost", 9000, $errno, $errstr, 30);

fwrite($socket, $out, count($out));

while (!feof($socket)) {
    echo fgets($socket, 128);
}

fclose($socket);

?>


Dit simpele stukje code zou gewoon de file test.xml moeten versturen en daarna de return-waarde van het programma "stdin" moeten returnen.

Dit gaat dus fout, het script hangt.

Comment ik het stuk met while() { fgets() } dan werkt het script wel correct.

Nu zou je zeggen dat PHP de EOF niet stuurt waardoor het stukje C++ code in een endless loop terecht komt, ook dat heb ik gecontroleert, maar dat is wel het geval.

Maak ik een ofstream en schrijf ik alle input die ik via stdin krijg naar een file dan werkt het wel als ik via PHP een connectie maak. De contents die ik stuur komen dan netjes in die file.

Zelfs "fread($socket, 1)" loopt klem.

Ik weet dat ik niet moet vragen, wat doe ik nu fout, please correct my code!!

Heeft iemand enig idee waar ik moet zoeken?

Ik heb al geprobeerd met "final newlines" te werken en niet op EOF te controleren, maar dat kreeg ik niet juist werkend.

Daarvoor had ik deze code:
code:
1
2
3
4
5
for(;;) {
        getline(cin, currentLine);      
        if (currentLine.empty()) break;     
        input += currentLine;
    }


In de php-code deed ik vervolgens:
code:
1
$out .= "\n";


Daarmee creëerde ik dan de final newline. Zonder resultaat, alsnog geen resultaat.

Heeft iemand een idee in welke hoek ik moet zoeken?

[ Voor 6% gewijzigd door Snow_King op 15-03-2006 19:30 ]