2 // g++ -O2 -g -pedantic -Wall fgfsclient.cxx -o fgfsclient -lstdc++
8 #include <netinet/in.h>
12 #include <sys/socket.h>
14 #include <sys/types.h>
19 const int MAXLEN = 256;
24 FGFSSocket(const char *name, const unsigned port);
27 int write(const char *msg, ...);
28 const char *read(void);
29 inline void flush(void);
30 void settimeout(unsigned t) { _timeout = t; }
42 FGFSSocket::FGFSSocket(const char *hostname = "localhost", const unsigned port = 5501) :
47 _sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
49 throw("FGFSSocket/socket");
51 struct hostent *hostinfo;
52 hostinfo = gethostbyname(hostname);
55 throw("FGFSSocket/gethostbyname: unknown host");
58 struct sockaddr_in serv_addr;
59 serv_addr.sin_family = AF_INET;
60 serv_addr.sin_port = htons(port);
61 serv_addr.sin_addr = *(struct in_addr *)hostinfo->h_addr;
63 if (connect(_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
65 throw("FGFSSocket/connect");
77 FGFSSocket::~FGFSSocket()
83 int FGFSSocket::close(void)
89 int ret = ::close(_sock);
95 int FGFSSocket::write(const char *msg, ...)
105 tv.tv_sec = _timeout;
107 if (!select(FD_SETSIZE, 0, &fd, 0, &tv))
108 throw("FGFSSocket::write/select: timeout exceeded");
111 vsprintf(buf, msg, va);
113 std::cout << "SEND: " << buf << std::endl;
114 strcat(buf, "\015\012");
116 len = ::write(_sock, buf, strlen(buf));
118 throw("FGFSSocket::write");
123 const char *FGFSSocket::read(void)
132 tv.tv_sec = _timeout;
134 if (!select(FD_SETSIZE, &fd, 0, 0, &tv)) {
138 throw("FGFSSocket::read/select: timeout exceeded");
141 len = ::read(_sock, _buffer, MAXLEN - 1);
143 throw("FGFSSocket::read/read");
147 for (p = &_buffer[len - 1]; p >= _buffer; p--)
148 if (*p != '\015' && *p != '\012')
151 return strlen(_buffer) ? _buffer : 0;
155 inline void FGFSSocket::flush(void)
165 int main(const int argc, const char *argv[])
167 const char *hostname = argc > 1 ? argv[1] : "localhost";
168 int port = argc > 2 ? atoi(argv[2]) : 5501;
170 FGFSSocket f(hostname, port);
172 f.write("set /controls/engines/engine[%d]/throttle %lg", 0, 1.0);
173 f.write("set /controls/engines/engine[%d]/throttle %lg", 1, 1.0);
174 f.write("get /sim/aircraft");
175 const char *p = f.read();
177 std::cout << "RECV: " << p << std::endl;
180 } catch (const char s[]) {
181 std::cerr << "Error: " << s << ": " << strerror(errno) << std::endl;
185 std::cerr << "Error: unknown exception" << std::endl;