// Written by Curtis Olson, started November 1999.
//
-// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#ifndef _SG_SOCKET_HXX
#define _SG_SOCKET_HXX
-
-#ifndef __cplusplus
-# error This library requires C++
-#endif
-
#include <simgear/compiler.h>
-#include STL_STRING
+#include <string>
#include <simgear/math/sg_types.hxx>
#include <simgear/io/iochannel.hxx>
-
-SG_USING_STD(string);
-
-#if defined(_MSC_VER)
-# include <winsock.h>
-#endif
+#include <simgear/io/raw_socket.hxx>
#define SG_MAX_SOCKET_QUEUE 32
*/
class SGSocket : public SGIOChannel {
public:
-#if defined(_MSC_VER)
- typedef SOCKET SocketType;
-#else
- typedef int SocketType;
-# define INVALID_SOCKET (-1)
-#endif
-
private:
- string hostname;
- string port_str;
+ std::string hostname;
+ std::string port_str;
char save_buf[ 2 * SG_IO_MAX_MSG_SIZE ];
int save_len;
- SocketType sock;
- SocketType msgsock;
- short unsigned int port;
- int sock_style; // SOCK_STREAM or SOCK_DGRAM
-
+ simgear::Socket sock;
+ simgear::Socket* client;
+ unsigned short port;
+ bool is_tcp;
+ bool is_server;
bool first_read;
+ int timeout;
+
+ static bool init;
// make a server (master listening) socket
- SocketType make_server_socket();
+ bool make_server_socket();
// make a client socket
- SocketType make_client_socket();
+ bool make_client_socket();
- // wrapper functions
- size_t readsocket( int fd, void *buf, size_t count );
- size_t writesocket( int fd, const void *buf, size_t count );
-#if !defined(_MSC_VER)
- int closesocket(int fd);
-#endif
-
-#if defined(_MSC_VER)
- // Ensure winsock has been initialised.
- static bool wsock_init;
- static bool wsastartup();
-#endif
+ // Poll for new connections or data to read.
+ int poll();
public:
* @param port port number if we care to choose one.
* @param style specify "udp" or "tcp"
*/
- SGSocket( const string& host, const string& port, const string& style );
+ SGSocket( const std::string& host, const std::string& port, const std::string& style );
/** Destructor */
~SGSocket();
*/
bool nonblock();
+ // set timeout (default: 0)
+ inline void set_timeout(int i) { timeout = i; }
+
/** @return the remote host name */
- inline string get_hostname() const { return hostname; }
+ inline std::string get_hostname() const { return hostname; }
/** @return the port number (in string form) */
- inline string get_port_str() const { return port_str; }
+ inline std::string get_port_str() const { return port_str; }
};