Problem with __gnu_cxx::stdio_filebuf and sockets
Jochen Klenner
jochen.klenner@gmx.net
Wed Mar 2 00:39:00 GMT 2005
Hi list,
I have trouble using g++'s stdio_filebuf extension with sockets.
I'm using gcc 3.4.1 on a Linux system.
Writing to a stdio_filebuf that is connected to a socket always fails,
leaving the stream in a bad state. See the following program for
illustration:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string>
#include <iostream>
#include <ext/stdio_filebuf.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(119);
int result;
result = connect(sockfd, (sockaddr*)(&address), sizeof(address));
if (result != 0) {
std::cerr << "connect failed " << std::endl;
exit(1);
}
__gnu_cxx::stdio_filebuf<char> sockBuf
(sockfd, std::ios_base::in | std::ios_base::out);
std::iostream sock(&sockBuf);
std::string in;
std::getline(sock, in); // succeeds
std::cout << in << std::endl;
if (!sock.good()) {
std::cerr << "socket is not good\n";
}
sock << "help\n"; // fails
if (sock.bad()) {
std::cerr << "write failed badly\n";
}
in.clear();
sock.clear();
std::getline(sock, in); // hangs
std::cerr << "have read\n";
}
This program connects to a local newsserver, that gives an informative
message first, and outputs more text after receiving the "help" message.
While the first getline works, the write does not, and "write failed
badly" is output. Then the second getline hangs forever.
When I do the same thing using the low-level read and write functions
instead of stdio_filebuf it works flawlessly.
Any clue about this issue is appreciated.
Best regards
Jochen
More information about the Gcc-help
mailing list