PlasCom2  1.0
XPACC Multi-physics simluation application
NetUtils.H
Go to the documentation of this file.
1 #include <sys/types.h>
7 #include <sys/socket.h>
8 #include <netinet/in.h>
9 #include <arpa/inet.h>
10 #include <errno.h>
11 #include <fcntl.h>
12 #include <netdb.h>
13 #include <unistd.h>
14 
15 #include <csignal>
16 #include <cstdlib>
17 #include <cstdio>
18 #include <cstring>
19 
20 #include <iostream>
21 #include <vector>
22 #include <algorithm>
23 
24 namespace ix {
25  namespace sys {
26 
28  namespace net {
29 
30  class Server {
31  private:
33  struct sockaddr_in _server_addy;
34  std::vector<int> _client_descriptors;
35  std::vector<struct sockaddr_in> _client_addys;
36  public:
37  Server() : _server_descriptor(-1)
38  {
39  std::memset(&_server_addy,0,sizeof(struct sockaddr_in));
40  _client_descriptors.resize(0);
41  _client_addys.resize(0);
42  };
43  struct sockaddr_in &Address() { return (_server_addy); };
44  const struct sockaddr_in Address() const { return (_server_addy); };
45  std::vector<int> &ClientDescriptors() { return(_client_descriptors); };
46  const std::vector<int> &ClientDescriptors() const { return(_client_descriptors); };
47  int &Descriptor() { return(_server_descriptor); };
48  int Descriptor() const { return(_server_descriptor); };
49  std::vector<struct sockaddr_in> &ClientAddresses() { return (_client_addys); };
50  const std::vector<struct sockaddr_in> &ClientAddresses() const { return(_client_addys); };
51  int SimpleInit(int port = 0)
52  {
53  _server_descriptor = socket(AF_INET,SOCK_STREAM,0);
54  if(_server_descriptor < 0){
55  perror("sys::net::Server::SimpleInit::socket");
56  return(-1);
57  }
58  if(port <= 0)
59  port = 8044; // should not collide with much ... if anything
60  _server_addy.sin_family = AF_INET;
61  _server_addy.sin_addr.s_addr = htonl(INADDR_ANY);
62  _server_addy.sin_port = htons(port);
63  int retval = bind(_server_descriptor,reinterpret_cast<const sockaddr *>(&_server_addy),
64  sizeof(struct sockaddr_in));
65  if(retval < 0){
66  perror("sys::net::Server::SimpleInit::bind");
67  return(-1);
68  }
69  if(listen(_server_descriptor,1)){
70  perror("sys::net::Server::SimpleInit::listen");
71  return(-1);
72  }
73  return(0);
74  };
75  int Accept()
76  {
77  struct sockaddr_in client_addy;
78  socklen_t addysize = sizeof(struct sockaddr_in);
79  int new_descriptor = accept(_server_descriptor,reinterpret_cast<sockaddr *>(&client_addy),
80  &addysize);
81  if(new_descriptor < 0){
82  if((errno != EAGAIN) || (errno != EWOULDBLOCK))
83  perror("sys::net::Server::accept");
84  }
85  else{
86  _client_descriptors.push_back(new_descriptor);
87  _client_addys.push_back(client_addy);
88  }
89  return(new_descriptor);
90  };
91  int CloseAll()
92  {
93  std::vector<int>::iterator fdi = _client_descriptors.begin();
94  while(fdi != _client_descriptors.end())
95  close(*fdi++);
96  return(0);
97  };
98  ~Server(){ CloseAll(); };
99  };
100 
101  class Client
102  {
103  private:
105  struct sockaddr_in _server_addy;
106  public:
107  Client() : _descriptor(-1)
108  {
109  std::memset(&_server_addy,0,sizeof(struct sockaddr_in));
110  };
111  int &Descriptor() { return(_descriptor); };
112  int Descriptor() const { return(_descriptor); };
113  struct sockaddr_in &ServerAddress() { return(_server_addy); };
114  const struct sockaddr_in ServerAddresss() const { return(_server_addy); };
115  int Connect(const std::string &server_address,int port = 0)
116  {
117  if(port <= 0)
118  port = 8044;
119  _descriptor = socket(AF_INET,SOCK_STREAM,0);
120  if(_descriptor < 0){
121  perror("sys::net::Client::Connect::socket");
122  return(-1);
123  }
124  _server_addy.sin_family = AF_INET;
125  _server_addy.sin_port = htons(port);
126  int retval = inet_pton(AF_INET,server_address.c_str(),&_server_addy.sin_addr);
127  if(retval < 0){
128  perror("sys::net::Client::Connect::inet_pton");
129  return(-1);
130  }
131  else if(retval == 0){
132  std::cerr << "sys::net::Client::Connect::inet_pton: Invalid address: "
133  << server_address << std::endl;
134  return(-1);
135  }
136  if(connect(_descriptor,reinterpret_cast<const sockaddr *>(&_server_addy),
137  sizeof(struct sockaddr_in)) < 0){
138  perror("sys::net::Client::Connect::connect");
139  return(-1);
140  }
141  return(0);
142  };
143  int Close() { if(_descriptor > 0) close(_descriptor); return(0);};
144  ~Client() { Close(); };
145  };
146  };
147  };
148 };
int SimpleInit(int port=0)
Definition: NetUtils.H:51
std::vector< struct sockaddr_in > & ClientAddresses()
Definition: NetUtils.H:49
struct sockaddr_in & ServerAddress()
Definition: NetUtils.H:113
std::vector< int > _client_descriptors
Definition: NetUtils.H:34
int Connect(const std::string &server_address, int port=0)
Definition: NetUtils.H:115
int Descriptor() const
Definition: NetUtils.H:48
const std::vector< int > & ClientDescriptors() const
Definition: NetUtils.H:46
Defines MPI-specific parallel global and program classes.
std::vector< struct sockaddr_in > _client_addys
Definition: NetUtils.H:35
int Descriptor() const
Definition: NetUtils.H:112
struct sockaddr_in & Address()
Definition: NetUtils.H:43
std::vector< int > & ClientDescriptors()
Definition: NetUtils.H:45
int & Descriptor()
Definition: NetUtils.H:47
const std::vector< struct sockaddr_in > & ClientAddresses() const
Definition: NetUtils.H:50
struct sockaddr_in _server_addy
Definition: NetUtils.H:33